一部のCコードを正しく実行するのに問題があります(Cを初めて使用するため、この質問がばかげている場合はご容赦ください。さらに、誰もが明確に理解できるように、これは実行に問題のあるコードです。唯一の部分は'書いたのはnullファイルハンドルチェックです)。基本的に、私のプログラムはでクラッシュしfclose
ます。最初のコード:
ファイルの先頭:
int *label;
メソッド固有:
void load_dat ()
{
int i, j, t, k;
FILE *in;
char t_file[16];
printf ("\nName of Raw Data File > ");
scanf ("%s", t_file);
in = fopen (t_file, "r");
if (in == NULL){
perror("fopen error");
}
fscanf (in, "%d %d %d", &num_pats, &a_length, &b_length);
dpt = (float **) malloc (sizeof(float *)*num_pats);
for (k=0; k<num_pats; k++){
dpt[k] = (float *) malloc (sizeof(float)*(a_length+b_length));
}
label = (int *) malloc (sizeof(int)*num_pats);
for (i=0; i<num_pats; i++)
{
for (j=0; j<a_length; j++)
{
fscanf (in, "%f", &dpt[i][j]);
}
fscanf (in, "%d", &label[i]);
if (label[i]<0 || label[i]>3)
printf ("ERROR: Label corrupted.\n");
for (t=0; t<b_length; t++){
dpt[i][t+a_length] = 0.0;
dpt[i][label[i]+a_length] = 1.0;
}
}
fclose (in);
}
プログラムからの私のエラーメッセージは次のとおりAbort trap: 6
です。これをグーグルで検索すると、最終的に私が使用するという提案が出され、次のようGBD
になりました。
Program received signal SIGABRT, Aborted.
と
#0 0x00007fff8c12582a in __kill ()
#1 0x00007fff871a3b6c in __abort ()
#2 0x00007fff871a0070 in __stack_chk_fail ()
#3 0x000000010000175f in load_dat ()
#4 0x0000000100001baa in main ()
#5 0x00000001000013e4 in start ()
メソッド全体をステップスルーすると、最終行に到達するまでプログラムはクラッシュしませんfclose(in)
。また、の値in
はプログラム全体で同じです。
の問題を検索して、このSO投稿fclose
に出くわしました。これにより、を使用してみることになりました。その出力(using )は次のとおりです。Valgrind
--leak-check=yes
==22688==
==22688== Process terminating with default action of signal 6 (SIGABRT)
==22688== at 0x2DD82A: __kill (in /usr/lib/system/libsystem_kernel.dylib)
==22688== by 0x18A06F: __stack_chk_fail (in /usr/lib/system/libsystem_c.dylib)
==22688== by 0x10000175E: load_dat (in ./dataPre)
==22688== by 0x100001BA9: main (in ./dataPre)
==22688==
==22688== HEAP SUMMARY:
==22688== in use at exit: 28,781 bytes in 83 blocks
==22688== total heap usage: 84 allocs, 1 frees, 32,877 bytes allocated
==22688==
==22688== LEAK SUMMARY:
==22688== definitely lost: 0 bytes in 0 blocks
==22688== indirectly lost: 0 bytes in 0 blocks
==22688== possibly lost: 0 bytes in 0 blocks
==22688== still reachable: 28,781 bytes in 83 blocks
==22688== suppressed: 0 bytes in 0 blocks
==22688== Reachable blocks (those to which a pointer was found) are not shown.
==22688== To see them, rerun with: --leak-check=full --show-reachable=yes
==22688==
==22688== For counts of detected and suppressed errors, rerun with: -v
==22688== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Abort trap: 6
この時点で、私はどこを見るべきか、何をすべきかについて途方に暮れています。
サンプルデータ:
44 96 3
0 0 17.57298681 24.18012088 0 24.07599728 0 0 0 19.53417371 22.61467731 15.5650829 18.65720893 21.70631048 26.8811321 23.88086356 23.73544942 0 0 22.63088094 21.11777268 22.06847477 22.38688445 19.6794802 20.95594497 22.56472976 15.5058779 0 16.89366861 21.23974633 0 19.01608872 22.58492673 22.39564384 18.17000387 0 0 25.85404904 23.80483437 22.64271243 0 17.09819014 24.60634479 0 24.74696139 29.27117194 20.8931952 19.08648917 23.95167438 0 0 17.2386599 0 0 23.22304254 22.86712074 0 21.45687449 21.45146304 0 0 0 20.98717232 0 18.09871479 17.8226754 23.72508288 23.34563846 21.26201041 17.44038043 22.49848573 18.99848797 16.43222002 14.8132735 22.28093734 17.78931496 0 20.46914933 17.87742323 21.07936723 23.52102135 0 17.90498094 21.93199281 0 0 16.3020812 0 18.17972854 16.43234906 19.0756696 0 0 22.98048214 23.22184013 21.54024161 0
num_pats
これは、行数、列数を指していることに注意してくださいa_length
。 b_length
異なる入力タイプの数(各行の最後の数)です。サンプルファイルには44行あります。