以下のコードでは、セグメンテーション違反の原因が見つからないようです。evaluate() から main() に戻った後、コメントのある行でコードがクラッシュします。このコードを gdb で調べたところ、評価関数内ではすべて問題ないようです。出力は正しく入力されていますが、メインに戻った後、メモリ内の何もアクセスできません。gdb の "p j" は、他の変数を出力しようとすると、メモリにアクセスできないというエラーを返します。スタックに多くの値が必要かどうかを確認しましたが、スタック サイズを大きくしても効果はありません。
クレイジーなことは、このエラーを解決できるということですが、なぜそれが何かを変えるのかわかりません。evaluate() のどこかに int 宣言 (例: ) を追加するとint iAmNotUsedEver;
、コードは突然セグメンテーション エラーを引き起こさず、gdb で完全に動作します。編集:evaluate()でnode[116]を動的に割り当てることでint *node = malloc(116*sizeof(int));
も問題は解決しますが、やはり理由がわかりませんか?
関数の評価: (コードの一部を削除しました。そうしないと、長すぎます)
void evaluate(int *parameter, int output[][16]) {
int node[116];
node[0] = 0;
output[0][0] = !node[0];
node[1] = parameter[0];
output[0][1] = !node[1];
output[0][2] = !node[0];
...
node[34] = !node[114] && !node[45];
node[45] = !node[34] && !node[105];
output[11][15] = node[45];
}
主な機能:
int main(int argc, char *argv[]) {
int i;
int j;
int k;
int ret;
int parameter[8];
int output[12][16];
FILE *paramFile;
FILE *outFile;
paramFile = fopen(argv[1], "r");
if (paramFile == NULL) {
printf("I couldn't open the parameter file.\n");
exit(0);
}
outFile = fopen(argv[2], "ab");
if (outFile == NULL) {
printf("Something went wrong with the output file.\n");
exit(0);
}
while(1){
for(i=0;i<8;i++){
ret=fscanf(paramFile, "%d", ¶meter[i]);
printf("parameter: %d\n", parameter[i]);
}
if(ret!=1){
break;
}
for(j=0;j<12;j++){
for(k=0;k<16;k++){
output[j][k] = 2;
}
}
evaluate(parameter,output);
printf("Evaluation is done. \t %d\n",i);
for(j=0;j<12;j++){ //SEG FAULT HERE
for(k=0;k<16;k++){
fprintf(outFile, "%d", output[j][k]);
}
fprintf(outFile,"\n");
}
fprintf(outFile,"\n\n\n");
}
printf("Closing files\n");
fclose(paramFile);
fclose(outFile);
return 0;
}