隣接行列のファイルを読み込んで、有向グラフの情報をdot形式で表示するプログラムを作成しているのですが、datファイルを読み込む際にsegmentation fault と出てしまいます。デバッグでエラーの出ている部分を探してみると、隣接行列をグラフに変換する関数(translate_into_graph)のところでエラーが出ていることがわかりました。
発生している問題→Segmentation fault(core dumped)
問題が発生するまでの流れ・手順→translate_into_graph()のところを作成していて、コンパイルする際はエラーは出ないが、datファイルを読み込んで有向グラフを表示する際にエラーが出る。
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #define N 100 #define boolean int #define true 1 #define false 0 typedef boolean adjmatrix[N][N]; typedef int vindex; typedef struct edgecell{ vindex destination; struct edgecell *next; } edgecell; typedef edgecell * vertices[N]; typedef struct{ int vertex_num; int edge_num; vertices vtop; }graph; int read_adjacency_matrix(char *datafile, adjmatrix mat){ FILE *fp; int vertex_num; vindex src, dest; fp = fopen( datafile, "r" ); fscanf( fp, "%d\n", &vertex_num ); if( vertex_num > N ){ fprintf(stderr, "##### このプログラムが扱えるのは頂点数が%dまでのグラフです\n", N); exit(1); } for (src = 0; src < vertex_num; src++){ for(dest = 0; dest < vertex_num; dest++){ fscanf( fp, "%d\n", &mat[src][dest] ); } } fclose( fp ); return vertex_num; } void add_edge(graph *g, vindex src, vindex dest){ edgecell *edge = (edgecell *)malloc(sizeof(edgecell)); edge->destination = dest; edge->next = g->vtop[src]; g->vtop[src] = edge; } void translate_into_graph(adjmatrix mat, graph *g){ vindex i,j; for(i = 0; i < g->vertex_num; i++){ g->vtop[i] = NULL; } for(i = 0; i < g->vertex_num; i++){ for(j = 0; j < g->vertex_num; i++){ if (mat[i][j] == 1) add_edge(g, i, j); } } } void print_graph(graph *g){ vindex v; printf("digraph G {\n"); printf(" size=\"14,10\"; node[fontsize=10,height=0.01,width=0.01]; edge[len=3.0];\n"); for(v = 0; v < g->vertex_num; v++){ edgecell *edge; for(edge = g->vtop[v]; edge != NULL; edge = edge->next){ printf(" %d -> %d;\n", v+1, edge->destination+1); } } printf("}\n"); } void free_graph(graph *g){ vindex v; for (v = 0; v < g->vertex_num; v++){ edgecell *edge, *next_edge; for(edge = g->vtop[v]; edge != NULL; edge = next_edge){ next_edge = edge->next; free( edge ); } } } int main( int argc, char *argv[] ){ char *datafile; adjmatrix a; graph g; if ( argc <= 1 ){ fprintf( stderr, "##### ファイルを指定してください\n"); return 1; } datafile = argv[1]; g.vertex_num = read_adjacency_matrix( datafile, a ); translate_into_graph( a, &g ); print_graph( &g ); free_graph( &g ); return 0; }
使用言語、環境→C, Cygwin64
回答1件
あなたの回答
tips
プレビュー