问题描述
所以我一直运行到哪里不知我的code为之前的任何我的主要的分割造成的故障问题实际运行。我从来没有过这种情况发生前,我几乎没有编码经验的四分之一的价值,所以我不知道是否有什么东西我做错了。一切编译,至少在我的电脑上,而是运行它我的主要是从来没有达到时。
上下文:我想点和边连接的邻接矩阵,然后用Prim算法构建MST,但这是供以后使用。我建了一个头文件,它最初包含只为结构和功能typdef调用。不过,我切换结构定义的头文件,因为我是越来越内存错误;因此为什么我觉得有一个问题与结构。
graph.h:
//利兰黄00000897031
//图形头文件#包括LT&;&stdio.h中GT;
#包括LT&;&stdlib.h中GT;
#包括LT&;&string.h中GT;
#包括LT&;&MATH.H GT;的#ifndef GRAPH_H
#定义GRAPH_Htypedef结构顶点
{
双经度;
双纬度;
焦城[30];
INT指数;
INT参观; // 0:没有去过,1:走访,2:参观
结构边缘*NEXTë;
结构顶点* NexTVTM方案;
双投射;
}顶点;
typedef结构边缘
{
结构顶点*启动;
结构顶点*目的地;
双距离;
结构边缘*NEXTë;
}边缘;
typedef结构图
{
结构顶点*名单[756];
结构边缘*矩阵[756] [756];
}图形;
/ *
typedef结构顶点顶点;
typedef结构边缘上的边缘;
typedef结构图图;
* /双findDistance(VERTEX * V1,顶点V2 *); //计算两个位置之间的距离
EDGE *连接(VERTEX * V1,顶点V2 *); //连接两个顶点和返回连接边缘
GRAPH primMatrix(GRAPH * G); //连接使用Prim算法的所有顶点的邻接矩阵
//无效lPrimConnect(顶点v); //连接使用Prim算法的所有顶点在邻接表
EDGE * findSmallestEdge(顶点v,图形* G); //发现连接到V最小的EDGE
#万一
graph.c:包含了我所有的函数的实现
//功能//计算v1和v2之间的距离
双findDistance(VERTEX * V1,VERTEX * V2)
{
的printf(findDistance);
双long1 = V1->经度;
双long2 = V2->经度;
双LAT1 = V1->纬度;
双LAT2 = V2->纬度;
双距离= 0; 如果(long1℃,)
long1 + = 360;
如果(long2℃,)
long2 + = 360; 距离=则函数powf((long1-long2),2)+则函数powf((LAT1 - LAT2),2);
距离=开方(距离);
返回距离;
}//创建并返回一个连接v1和v2的边缘
EDGE *连接(VERTEX * V1,VERTEX * V2)
{
的printf(连接);
EDGE *新的;
新建 - >开始= V1;
新建 - >目标= V2;
新建 - >距离= findDistance(V1,V2);
返回新;
}
//发现图g连接到V最小边缘
EDGE * findSmallestEdge(顶点v,图形* G)
{
的printf(findSmallestEdge);
EDGE *坦佩;
INT I,指数;
指数= v.index; //设置坦佩等于连接到v的第一边缘
坦佩= G->矩阵[指数] [0];
//找到连接到V最小边缘
对于(i = 0; I< 756;我++)
{
如果(G->矩阵[指数] [I] - >距离< tempe->距离和放大器;&安培; G->清单[指数] - >参观== 0)
{
坦佩= G->矩阵[指数] [I];
}
}
返回坦佩;
}//使用Prim算法创建MST出图G
GRAPH primMatrix(GRAPH * G)
{
的printf(primMatrix);
GRAPH新; // =的malloc(sizeof的(图));
EDGE *最小;
EDGE *坦佩;
INT I,X;
I = 1;
X = 0; new.list [0] = G->清单[0]; //根节点添加到MST
G->清单[0] - >参观= 2;
最小= findSmallestEdge(* new.list [0],G);
new.matrix [0] [smallest-> destination->指数=最小;
// MST将包含所有756个节点,那么运行这个755次,以确保所有节点都达到
而(I< 756)
{
X = 0;
最小= findSmallestEdge(* new.list [I],G);
// I =顶点的数量已经达到
而(X< I)
{
坦佩= findSmallestEdge(* new.list [X],G);
如果(坦佩 - >距离<最小 - >距离)
{
最小=坦佩;
}
X ++;
}
new.list [i] =最小 - >目的地;
最小 - >目的地 - >访问= 2;
new.matrix [smallest->开始 - >指数] [smallest-> destination->指数=最小;
我++;
}
返回新;
}
graphmatrixmain.c:我的主要功能,构建图
的#includegraph.hINT主(INT ARGC,CHAR *的argv [])
{
FILE * FP;
静态图g;
字符缓冲区[200];
INT I,J;
焦城[30];
字符* long1;
字符* LAT1; 如果(的argc == 1)
{
的printf(无法打开文件\\ n);
返回0;
} 其他
FP = FOPEN(的argv [1],R); //读取从txt文件中的数据线,建立一个新的顶点,并插入到列表
而(与fgets(缓冲液,200,FP)!= NULL)
{
VERTEX *新的malloc =(sizeof的(顶点));
的printf(%S,缓冲区);
sscanf的(缓冲,%s%s%S,市,long1,LAT1);
// sscanf的(缓冲,%[^ \\ t] \\ T%[^ \\ t] \\ t%S,市,long1,LAT1);
的printf(数据\\ n扫描);
新建 - >经度= ATOF(long1);
新建 - >纬度= ATOF(LAT1);
新建 - >指数= I;
g.list [I] =新的;
的printf(%S(%LF,LF%),新建 - >城市,新 - >经度,新建 - >纬度);
我++;
}
//创建EDGE,并在列表中的每个顶点之间进行连接
对于(i = 0; I< 756;我++)
{
为(J = 0; J< 756; J ++)
{
g.matrix [I] [J] =连接(g.list [I],g.list [J]);
如果(J == 0)
{
g.list [I] - >NEXTë= g.matrix [I] [J]。
}
}
}
返回0;
}
在情况下,其必须的,这是我从我读文件:cities.txt
它包含了756项总,但至于code而言大小不应该是相关的
上海121.47 31.23
孟买72.82 18.96
卡拉奇67.01 24.86
布宜诺斯艾利斯-58.37 -34.61
德里77.21 28.67
伊斯坦布尔29 41.1
马尼拉120.97 14.62
圣保罗-46.63 -23.53
莫斯科37.62 55.75
Usually, this means that the data structures that your main
tries to place in the automatic storage area overflow the stack. In your situation, it looks like the GRAPH
is a suitable suspect to do just that: it has a 2D array with 571536 pointers, which could very well overflow the stack before your main
gets a chance to start.
One solution to this problem would be moving the GRAPH
into the static
area: since you allocate it in the main
, it's going to be only one instance of it anyway, so declaring it static should fix the problem:
static GRAPH g;
You might also want to allocate it in the dynamic area using malloc
, but in this case it probably does not matter.
这篇关于前主段错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!