неудобное поведение при чтении файла в программе c (сигнал SIGSEV)

Я реализовал программу, которая должна найти минимальное остовное дерево, используя Prim. Ребра графа описаны в файле.

Итак, в первую очередь программа читает этот файл и сохраняет ребра в структуре данных. После этого он запускает алгоритм. Вот полный код:

      #include <stdio.h>


    #include <stdlib.h>

      #define MAXVERTICES 1000
      #define INFINITY 99999
      #define TAILLEMAX 100

      struct vertex {
            int visited, predecessor;
            int dist;   // distance qui sépare ce noeud de la distance minimale d'un autre noeud
      };

      int treeEdge[MAXVERTICES][2], mstCost; // tableau des 'aretes' qui constituent l'arbre couvrant
      int graphEdge[MAXVERTICES][MAXVERTICES], nodeCount; // matrice d'adjacences (couts séparant chaque sommet des autres sommets)
      struct vertex node[MAXVERTICES];  // tableau de sommets numérotés de 1 à n

      /* construct the input graph */

      void buildGraph() {
            int source, dest, weight, test;
            char temp[TAILLEMAX];

        FILE* fichier = NULL;
        fichier = fopen("inst_v100.txt", "r");
        if (fichier != NULL)
        {
            fgets(temp, TAILLEMAX, fichier); // sauter ligne
            fscanf(fichier,"%s%d",temp,&nodeCount); // nbr de sommets
            fgets(temp, TAILLEMAX, fichier);
            fgets(temp, TAILLEMAX, fichier);

            while (1)
            {
                    test = fscanf(fichier,"%d%d%d",&source,&dest,&weight);
                    if(test==0)
                        break;
                    /* update weight of the edge */
                    graphEdge[source][dest] = weight;
                    graphEdge[dest][source] = weight;
                    fgets(temp, TAILLEMAX, fichier); // sauter ligne
            }
        }
        fclose(fichier);
        return;
  }



    /* all vertices are visited or not */
      int allVisited() {
            int i;
            for (i = 0; i < nodeCount; i++)
                    if (node[i].visited == 0)
                            return 0;
            return 1;
      }

      /* construct minimum spanning tree */
      int buildTree() {
            int i = 0, count = 0, currentNode, mindist;
            while (i < nodeCount) {
                    node[i].visited = 0;
                    node[i].predecessor = 0;
                    node[i].dist = INFINITY;
                    i++;
    }

        node[0].visited = 1;
        node[0].dist = 0;

        currentNode = 0;
        while (allVisited() == 0) {
                for (i = 0; i < nodeCount; i++) {  // pour le sommet courant, chercher la distance min qui le sépare de chaque sommet

                        /* Find the adjacent vertices and update the edge lenght */
                        if(graphEdge[currentNode][i] > 0 && node[i].visited == 0) {
                                if (graphEdge[currentNode][i] < node[i].dist) {
                                        node[i].predecessor = currentNode;
                                        node[i].dist = graphEdge[currentNode][i];
                                }
                        }
                }

                mindist = INFINITY;
                /* trouver l'arete avec le poids minimum */
                for (i = 0; i < nodeCount; i++) {
                        if (node[i].dist < mindist && node[i].visited == 0) {
                                mindist = node[i].dist;
                                currentNode = i;
                        }
                }
                /* Mark the vertex as visited - edge with min cost */
                node[currentNode].visited = 1;
                treeEdge[count][0] = node[currentNode].predecessor;
                treeEdge[count][1] = currentNode;

                /* calculate cost of MST */
                mstCost = mstCost + graphEdge[treeEdge[count][0]][treeEdge[count][1]];
                count++;
        }
        return count;
  }

  int main() {
        int i, count1;

        /* construct graph */
        buildGraph();
        count1 = buildTree();
        printf("MST is composed of below edges:\n");
        for (i = 0; i < count1; i++) {
                printf("%d<->%d\n", treeEdge[i][0], treeEdge[i][1]);
        }
        printf("\n");
        printf("Cost of Minimum Spanning Tree: %d\n", mstCost);
        return 0;
  }

Как ни странно, когда начинается выполнение, программа отправляет сигнал SIGSEV.

не могли бы вы помочь мне понять ошибку, которую я делаю? Заранее спасибо.


person codeless    schedule 26.12.2014    source источник
comment
Когда начнется казнь??? Не могли бы вы придумать чуть более точное описание???   -  person barak manos    schedule 26.12.2014
comment
это означает, что когда я запускаю выполнение программ, извините за мой плохой английский, поэтому я не могу толком объяснить. @SouravGhosh Я добавлю некоторые подробности о содержимом файла, я должен был уточнить, что он содержит более 4950 строк.   -  person codeless    schedule 26.12.2014
comment
gdb твой друг. По крайней мере, нам нужно знать, где происходит сбой программы. Это может быть так же просто, как файл, который не найден, и программа error">segfaulting в fclose(NULL).   -  person NPE    schedule 26.12.2014
comment
gdb говорит, что ошибка в этой строке: treeEdge[count][0] = node[currentNode].predecessor;   -  person codeless    schedule 26.12.2014
comment
Я не смотрю достаточно внимательно, но я не вижу и не могу проверить count и nodeCount.   -  person Sourav Ghosh    schedule 26.12.2014


Ответы (1)


Задача решена.

На самом деле, если вы внимательно посмотрите, я использовал fgets и fscanf, и это вызвало двусмысленность. Решение заключалось в использовании fgets (для сохранения прочитанной строки в строке), затем sscanf для получения необходимой информации из этой строки.

Это дает что-то вроде этого:

    fgets(the_string, MAXLENGTH, file);
    sscanf(the_string,"%d",&number_wanted);

в любом случае большое спасибо, и я надеюсь, что мой ответ будет полезен для других людей с такой же проблемой.

person codeless    schedule 26.12.2014