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

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

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

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

Q&A

解決済

2回答

2545閲覧

Fatal error: glibc detected an invalid stdio handleというエラーが出る

yu_89

総合スコア34

C

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

0グッド

0クリップ

投稿2022/10/22 09:13

解決したいこと

C言語でバイナリファイルを2つ同時に入力し、29296回を1ループとしてファイルの終端まで繰り返し計算して二次元配列としてファイルに書き出すというコードを書いているのですが、"Fatal error: glibc detected an invalid stdio handle"というエラーが出て、コアダンプしてしまいます。
色々手は尽くしたのですが、解決しません。何が原因なのでしょうか。

どなたかわかる方、ご教授のほどよろしくお願いします。

発生している問題・エラーメッセージ

Processing 29296 th frame s_ka=0.084542, s_kb=0.084899 Fatal error: glibc detected an invalid stdio handle 中止 (コアダンプ)

該当のソースコード

test.c

1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4 5int main(int argc,const char *argv[]) 6 { 7 int N=1024; 8 int i, j, n, n_frame, iter, flag; 9 10 float ar1[N], ai1[N], ar2[N], ai2[N]; 11 12 double tempr1[N], tempi1[N], tempr2[N], tempi2[N]; 13 14 double pwr1, pwi1, pwr2, pwi2; 15 double dcnt[N]; 16 17 double S1r1[N], S2r1[N], S3r1[N], S4r1[N]; 18 double S1i1[N], S2i1[N], S3i1[N], S4i1[N]; 19 double Myu1r1[N], Myu2r1[N], Myu3r1[N], Myu4r1[N]; 20 double Myu1i1[N], Myu2i1[N], Myu3i1[N], Myu4i1[N]; 21 22 double S1r2[N], S2r2[N], S3r2[N], S4r2[N]; 23 double S1i2[N], S2i2[N], S3i2[N], S4i2[N]; 24 double Myu1r2[N], Myu2r2[N], Myu3r2[N], Myu4r2[N]; 25 double Myu1i2[N], Myu2i2[N], Myu3i2[N], Myu4i2[N]; 26 27 double M1r[N], M2r[N], M3r[N], M4r[N], M1a[N], M2a[N], M3a[N], M4a[N]; 28 double M1i[N], M2i[N], M3i[N], M4i[N], M1b[N], M2b[N], M3b[N], M4b[N]; 29 30 double Kr[N], Ki[N], Ka[N], Kb[N]; 31 32 double Mr[N], Mi[N], Ma[N], Mb[N]; 33 double Fr[N], Fi[N], Fa[N], Fb[N]; 34 double sum_ka, sum_kb; 35 double s_ka, s_kb; 36 37 double ba[N], bb[N], xa[N], xb[N]; 38 39 double modi_Myu2r[N], modi_Myu2i[N], modi_av[N], modi_power[N]; 40 41 FILE *fp1, *fp2, *fpr, *fpi, *fkr, *fki, *fkrr, *fkii; 42 43 int fft1(); 44 int window_func(); 45 int cmpnum(); 46 47 /* check the number of input argument */ 48 49 if(argc != 4) 50 { 51 printf("Usage: ./fft2 <No.1 input file name> <No.2 input file name> <number of frames>\n"); 52 exit(1); 53 } 54 55 n_frame=atoi(argv[3]); 56 57 // initialize arrays 58 59 fp1 = fopen(argv[1], "r"); 60 fp2 = fopen(argv[2], "r"); 61 62 63 iter=0; 64 flag=0; 65 66 fpr = fopen("kurtosis_890_spec_ref.dat", "w"); 67 68 fkr = fopen("modi_kr_890_spec_ref.txt", "w"); 69 70 fki = fopen("modi_ki_890_spec_ref.txt", "w"); 71 72 fkrr = fopen("kr_890_spec_ref.txt", "w"); 73 74 fkii = fopen("ki_890_spec_ref.txt", "w"); 75 76 77 while(1) 78 { 79 if(feof(fp1) != 0) 80 break; 81 else { 82 83 for(i = 0; i < N; i++) 84 { 85 ar1[i] = 0.0; 86 ai1[i] = 0.0; 87 ar2[i] = 0.0; 88 ai2[i] = 0.0; 89909192 } 93 94 for(n = 0; n < n_frame; n++) 95 { 96 printf("\rProcessing %10d th frame",n+1); 97 98 for(i = 0; i < N; i++) 99 { 100 fread(&ar1[i], sizeof(float), 1, fp1); //ファイル読み込み 101 fread(&ai1[i], sizeof(float), 1, fp1); 102 } 103 104 for(i = 0; i < N; i++) 105 { 106 fread(&ar2[i], sizeof(float), 1, fp2); 107 fread(&ai2[i], sizeof(float), 1, fp2); 108 } 109 110 window_func(ar1, N); //窓関数適用 111 window_func(ai1, N); 112 fft1(ar1, ai1, N, iter, flag); //FFT実行 113 114 window_func(ar2, N); 115 window_func(ai2, N); 116 fft1(ar2, ai2, N, iter, flag); 117 118 for(i = 0; i < N/2; i++) 119 { 120 tempr1[i] = ar1[i]; //周波数軸上での入れ替え 121 ar1[i] = ar1[N/2+i]; 122 ar1[N/2+i] = tempr1[i]; 123 124 tempi1[i] = ai1[i]; 125 ai1[i] = ai1[N/2+i]; 126 ai1[N/2+i] = tempi1[i]; 127 } 128 129 for(i = 0; i < N/2; i++) 130 { 131 tempr2[i] = ar2[i]; 132 ar2[i] = ar2[N/2+i]; 133 ar2[N/2+i] = tempr2[i]; 134 135 tempi2[i] = ai2[i]; 136 ai2[i] = ai2[N/2+i]; 137 ai2[N/2+i] = tempi2[i]; 138 } 139 140 for(i = 0; i < N; i++) 141 { 142 pwr1 = ar1[i]; 143 pwi1 = ai1[i]; 144 145 S1r1[i] += (double)pwr1; //和を計算 146 S1i1[i] += (double)pwi1; 147 148 S2r1[i] += pow((double)pwr1, 2.0); //2乗和を計算 149 S2i1[i] += pow((double)pwi1, 2.0); 150 151 S3r1[i] += pow((double)pwr1, 3.0); //3乗和を計算 152 S3i1[i] += pow((double)pwi1, 3.0); 153 154 S4r1[i] += pow((double)pwr1, 4.0); //4乗和を計算 155 S4i1[i] += pow((double)pwi1, 4.0); 156 157 dcnt[i] += 1.0; //繰り返した回数を計算 158 } 159 160 for(i = 0; i < N; i++) 161 { 162 pwr2 = ar2[i]; 163 pwi2 = ai2[i]; 164 165 S1r2[i] += (double)pwr2; 166 S1i2[i] += (double)pwi2; 167 168 S2r2[i] += pow((double)pwr2, 2.0); 169 S2i2[i] += pow((double)pwi2, 2.0); 170 171 S3r2[i] += pow((double)pwr2, 3.0); 172 S3i2[i] += pow((double)pwi2, 3.0); 173 174 S4r2[i] += pow((double)pwr2, 4.0); 175 S4i2[i] += pow((double)pwi2, 4.0); 176 } 177 } 178 179 printf("\n"); 180 181 for(i = 0; i < N; i++) 182 { 183 Myu1r1[i] = S1r1[i] / dcnt[i]; //平均を計算 184 Myu1i1[i] = S1i1[i] / dcnt[i]; 185 186 Myu2r1[i] = S2r1[i] / dcnt[i]; 187 Myu2i1[i] = S2i1[i] / dcnt[i]; 188 189 Myu3r1[i] = S3r1[i] / dcnt[i]; 190 Myu3i1[i] = S3i1[i] / dcnt[i]; 191 192 Myu4r1[i] = S4r1[i] / dcnt[i]; 193 Myu4i1[i] = S4i1[i] / dcnt[i]; 194 } 195 196 for(i = 0; i < N; i++) 197 { 198 Myu1r2[i] = S1r2[i] / dcnt[i]; 199 Myu1i2[i] = S1i2[i] / dcnt[i]; 200 201 Myu2r2[i] = S2r2[i] / dcnt[i]; 202 Myu2i2[i] = S2i2[i] / dcnt[i]; 203 204 Myu3r2[i] = S3r2[i] / dcnt[i]; 205 Myu3i2[i] = S3i2[i] / dcnt[i]; 206 207 Myu4r2[i] = S4r2[i] / dcnt[i]; 208 Myu4i2[i] = S4i2[i] / dcnt[i]; 209 } 210 211 /* 尖度の計算 */ 212 213 for(i = 0; i < N; i++) 214 { 215 M1r[i] = 4.0 * Myu3r1[i] * Myu1r1[i]; 216 M1i[i] = 4.0 * Myu3i1[i] * Myu1i1[i]; 217 218 M2r[i] = 6.0 * Myu2r1[i] * pow(Myu1r1[i], 2.0); 219 M2i[i] = 6.0 * Myu2i1[i] * pow(Myu1i1[i], 2.0); 220 221 M3r[i] = 3.0 * pow(Myu1r1[i], 4.0); 222 M3i[i] = 3.0 * pow(Myu1i1[i], 4.0); 223 224 M4r[i] = Myu2r1[i] - pow(Myu1r1[i], 2.0); 225 M4i[i] = Myu2i1[i] - pow(Myu1i1[i], 2.0); 226 227 M1a[i] = 4.0 * Myu3r2[i] * Myu1r2[i]; 228 M1b[i] = 4.0 * Myu3i2[i] * Myu1i2[i]; 229 230 M2a[i] = 6.0 * Myu2r2[i] * pow(Myu1r2[i], 2.0); 231 M2b[i] = 6.0 * Myu2i2[i] * pow(Myu1i2[i], 2.0); 232 233 M3a[i] = 3.0 * pow(Myu1r2[i], 4.0); 234 M3b[i] = 3.0 * pow(Myu1i2[i], 4.0); 235 236 M4a[i] = Myu2r2[i] - pow(Myu1r2[i], 2.0); 237 M4b[i] = Myu2i2[i] - pow(Myu1i2[i], 2.0); 238 } 239 240 for(i = 0; i < N; i++) 241 { 242 Kr[i] = (Myu4r1[i] - M1r[i] + M2r[i] - M3r[i]) / pow(M4r[i], 2.0); 243 Ki[i] = (Myu4i1[i] - M1i[i] + M2i[i] - M3i[i]) / pow(M4i[i], 2.0); 244 245 Ka[i] = (Myu4r2[i] - M1a[i] + M2a[i] - M3a[i]) / pow(M4a[i], 2.0); 246 Kb[i] = (Myu4i2[i] - M1b[i] + M2b[i] - M3b[i]) / pow(M4b[i], 2.0); 247 248 fprintf(fkrr, "%lf ", Kr[i]); 249 fprintf(fkii, "%lf ", Ki[i]); 250 } 251 252 fprintf(fkrr, "\n"); 253 fprintf(fkii, "\n"); 254 255 /* 尖度の計算 終了 */ 256 257 258 /* 尖度のしきい値の計算 */ 259 260 for(i = 0;i < N; i++) 261 { 262 Mr[i] = Kr[i] - 3.0; 263 Mi[i] = Ki[i] - 3.0; 264 265 Fr[i] = fabs(Mr[i]); 266 Fi[i] = fabs(Mi[i]); 267 268 Ma[i] = Ka[i] - 3.0; 269 Mb[i] = Kb[i] - 3.0; 270 271 Fa[i] = fabs(Ma[i]); 272 Fb[i] = fabs(Mb[i]); 273 } 274 275 for(i = 0; i < N; i++) 276 { 277 sum_ka += pow(Ma[i], 2.0); 278 sum_kb += pow(Mb[i], 2.0); 279 } 280 281 s_ka = 3.0 * sqrt(sum_ka / N); 282 s_kb = 3.0 * sqrt(sum_kb / N); 283 284 printf("s_ka=%lf, s_kb=%lf\n", s_ka, s_kb); 285 286 /* 尖度のしきい値の計算 終了 */ 287 288 289 290 /* RFIの判別 */ 291 292 for(i = 0; i < N; i++) 293 { 294 if(Fr[i] > s_ka && Fi[i] > s_kb) 295 { 296 xa[i] = log(0.0); 297 xb[i] = log(0.0); 298 299 ba[i] = 0.0; 300 bb[i] = 0.0; 301 } else { 302 xa[i] = Kr[i]; 303 xb[i] = Ki[i]; 304 305 ba[i] = Myu2r1[i]; 306 bb[i] = Myu2i1[i]; 307 } 308 309 fprintf(fpr, "%lf ", xa[i]); 310 fprintf(fpi, "%lf ", xb[i]); 311 312 } 313 314 fprintf(fpr, "\n"); 315 fprintf(fpi, "\n"); 316 317 /* RFIの判別 終了 */ 318 319 320 /* RFI除去後のスペクトルの計算 */ 321 322 for(i = 0; i < N; i++) 323 { 324 modi_Myu2r[i] = ba[i]; 325 modi_Myu2i[i] = bb[i]; 326 } 327 328 for(i = 0; i < N; i++) 329 { 330 modi_av[i] = (modi_Myu2r[i] + modi_Myu2i[i]) / 1000000; 331 modi_power[i] = 10 * log10(modi_av[i]); 332 } 333 334 for(i = 0; i < N; i++) 335 { 336 fprintf(fpr, "%lf ", modi_power[i]); 337 } 338 339 fprintf(fpr, "\n"); 340 341 /* RFI除去後のスペクトルの計算 終了 */ 342 } 343 344 } 345 346 fclose(fkrr); 347 348 fclose(fkii); 349 350 fclose(fkr); 351 352 fclose(fki); 353 354 fclose(fpr); 355 356 fclose(fp1); 357 358 fclose(fp2); 359 360 361 362 return 0; 363 364 } 365 366FFTと窓関数のコードは割愛

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

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

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

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

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

jimbe

2022/10/22 11:18

まずはどこで発生しているのかを特定してください。
thkana

2022/10/22 11:38

> 二次元配列としてファイルに書き出す というのは具体的にどういう意味ですか? 質問に書かれていない部分に巨大(MBのオーダー)なローカル変数をとってスタックエリアを使い潰していたりするようなことはありませんか? > int fft1(); > int window_func(); > int cmpnum(); は関数プロトタイプ宣言ですよね? そこに書くのが間違いとは言いませんが、慣習としては関数定義の外側に記述するものかと思います。相当違和感があります。
yu_89

2022/10/24 02:37

jimbeさん、thkanaさん、ご回答いただき、ありがとうございます。 返信が遅れてしまい、申し訳ございません。 特定してみます。 関数のプロトタイプ宣言の位置も修正しておきます。
guest

回答2

0

/* RFIの判別 */ for(i = 0; i < N; i++) { if(Fr[i] > s_ka && Fi[i] > s_kb) { xa[i] = log(0.0); xb[i] = log(0.0); ba[i] = 0.0; bb[i] = 0.0; } else { xa[i] = Kr[i]; xb[i] = Ki[i]; ba[i] = Myu2r1[i]; bb[i] = Myu2i1[i]; } fprintf(fpr, "%lf ", xa[i]); fprintf(fpi, "%lf ", xb[i]); }

上記の各行にブレークポイントを配置して、実行されるエラーの行を確認します

投稿2022/10/24 02:10

fenyun

総合スコア20

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

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

yu_89

2022/10/24 02:38

ご回答いただき、ありがとうございます。 返信が遅れてしまい、申し訳ございません。 どこでエラーが出ているのかを確認してみます。
fenyun

2022/10/24 03:29

問題はfpiにあるようです おめでとう
guest

0

ベストアンサー

fpiについてopen処理がないから...かな?

投稿2022/10/22 11:43

thkana

総合スコア7629

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

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

yu_89

2022/10/24 02:40

ご回答いただき、ありがとうございます。 返信が遅れてしまい、申し訳ございません。 確かにfpiのopen処理がありませんでした。完全に見落としていました。 修正したところ、動きました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問