前提・実現したいこと
既にある隣接行列において、特定の行と列を取り除いた後に、残った行列で省いた箇所を詰め直し、新しく隣接行列を作ろうと考えています。尚、既にある隣接行列はその後に使うためデータとして残し、新しく隣接行列を作ります。
例:8*8の隣接行列において、2、5のそれぞれの行と列を取り除く。2行目全体、2列目全体といった感じです。取り除かれなかった部分で詰め直して新しく隣接行列を作り直したいです。
発生している問題・エラーメッセージ
セグメントエラーと思われる箇所にて参照できないメモリを使ってしまっているのかと考えたのですが、どこが直接の原因なのか突き止めるこトができません。
セグメントエラーが発生しています
該当のソースコード
#include <stdio.h> #include <stdlib.h> #include <string.h> #define NAME_MAX 256 int main( int argc, char *argv[] ) { int i, j; int N = 0; int **adjacent; int **new_adjacent; int n1, n2; FILE *fp; char fn[NAME_MAX]; int delete1 = 2;//例:取り除く行と列 int delete2 = 5;//例:取り除く行と列 int a=0; int b=0; if ( argc != 2 ) { fprintf( stderr, "Usage: %s graph_file\n", argv[0] ); exit( 1 ); } strcpy( fn, argv[1] ); if (( fp = fopen( fn, "r" )) == NULL ) { fprintf( stderr, "File open error %s\n", fn ); exit( 1 ); } //ファイルの先頭を読み取り行列の大きさを取得する fscanf( fp, "%d", &N ); adjacent = (int **)malloc(sizeof(int *)*N); for(i=0;i<N;i++){ adjacent[i] = (int *)malloc(sizeof(int)*N); } for(i=0;i<N;i++) for(j=i;j<N;j++) adjacent[i][j] = adjacent[j][i] = 0; while( fscanf( fp, "%d %d", &n1, &n2 ) != EOF ) { adjacent[n1][n2]++; adjacent[n2][n1]++; } //display for ( i=0; i<N; i++ ) { for ( j=0; j<N; j++ ) printf( "%d ", adjacent[i][j] ); printf( "\n" ); } //ここでは予め省く要素数が既知であるため、N-2とする //6*6の新しい隣接行列を作り、該当するadjacentの値を入れていく new_adjacent = (int **)malloc(sizeof(int *)*(N-2)); for(i=0;i<N-2;i++){ new_adjacent[i] = (int *)malloc(sizeof(int)*(N-2)); } //該当する行またはラインを読まないようにする //セグメントエラーが発生している箇所 for ( i=0; i<N; i++ ) { for ( j=0; j<N; j++ ){ if(!(i==delete1 || i==delete2 || j==delete1 || j==delete2)){ new_adjacent[a][b] = adjacent[i][j]; b++; } } b=0; a++; } printf("\n"); //display for ( i=0; i<N-2; i++ ) { for ( j=0; j<N-2; j++ ) printf( "%d ", new_adjacent[i][j] ); printf( "\n" ); } for(i=0;i<N-2;i++) free(new_adjacent[i]); free(new_adjacent); for(i=0;i<N;i++) free(adjacent[i]); free(adjacent); return 0; }
読み取るファイル
8 4 3 4 1 3 2 1 0 1 2 2 5 0 5 0 6 6 7 7 5 0 7 6 5 5 1 2 0 3 0 4 5
試したこと
省きたいラインをforループで回したときに読み込まないようにすることでnew_adjacentへ格納できると思いプログラムを書きました。しかし、要素数が順番にならないため別の変数(a,b)を用いて試したのですが、セグメントエラーが発生しました。このエラーが発生している箇所はプログラムに書きました。
この箇所の記述が上手くイメージできません。
補足情報(FW/ツールのバージョンなど)
Oracle VM VirtualBox
回答3件
あなたの回答
tips
プレビュー