質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1013閲覧

datファイルとSegmentation faultについて

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/11/28 06:12

隣接行列のファイルを読み込んで、有向グラフの情報を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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2021/11/28 07:00

datファイルの内容は、どのようになってますか。
coco_bauer

2021/11/28 07:44

adjmatrixで読み込んでいるdatファイルに矛盾する箇所があるのではないかと思われます。 ごく小さな(5x5とか)配列データを用意して、それをdatファイルに書きだして、それを質問のプログラムで使ってみてください。 datファイルを修正することで解決する可能性が高いように思われますので。 datファイルの内容を質問に追加することは可能でしょうか? 使っているデータが判れば、それを修正する方法を考える事が出来ると思います。
退会済みユーザー

退会済みユーザー

2021/11/28 07:55

datファイルの内容は以下のようになっています。 4 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 0
guest

回答1

0

ベストアンサー

if (mat[i][j] == 1)の個所で、異常終了しています。

C

1void translate_into_graph(adjmatrix mat, graph *g){ 2 vindex i,j; 3 for(i = 0; i < g->vertex_num; i++){ 4 g->vtop[i] = NULL; 5 } 6 7 for(i = 0; i < g->vertex_num; i++){ 8 for(j = 0; j < g->vertex_num; i++){ //ここがおかしい。i++ではなくj++ではないでしょうか。 9 if (mat[i][j] == 1) 10 add_edge(g, i, j); 11 } 12 } 13} 14

投稿2021/11/28 08:21

tatsu99

総合スコア5470

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/28 08:59

見落としていました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問