前主段错误

扫码查看
本文介绍了前主段错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我一直运行到哪里不知我的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.

这篇关于前主段错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-19 20:39
查看更多