質問編集履歴

2

ファイルポインタのNULLチェックを入れました。

2023/04/25 12:41

投稿

yu_89
yu_89

スコア34

test CHANGED
File without changes
test CHANGED
@@ -134,6 +134,17 @@
134
134
 
135
135
  fp = fopen(argv[1],"r");
136
136
  fp1 = fopen(argv[2],"r");
137
+
138
+ if(fp == NULL)
139
+ printf("fp:cannnot open file\n");
140
+ else
141
+ printf("fp:open file\n");
142
+
143
+ if(fp1 == NULL)
144
+ printf("fp1:cannnot open file\n");
145
+ else
146
+ printf("fp1:open file\n");
147
+
137
148
 
138
149
  iter = 0;
139
150
  flag = 0;
@@ -187,25 +198,7 @@
187
198
  S4r1[i] += pow((double)pwr1, 4.0);
188
199
  S4i1[i] += pow((double)pwi1, 4.0);
189
200
  }
190
-
191
- for(i = 0; i < N; i++)
201
+
192
- {
193
- pwr2 = ar2[i];
194
- pwi2 = ai2[i];
195
-
196
- S1r2[i] += (double)pwr2;
197
- S1i2[i] += (double)pwi2;
198
-
199
- S2r2[i] += pow((double)pwr2, 2.0);
200
- S2i2[i] += pow((double)pwi2, 2.0);
201
-
202
- S3r2[i] += pow((double)pwr2, 3.0);
203
- S3i2[i] += pow((double)pwi2, 3.0);
204
-
205
- S4r2[i] += pow((double)pwr2, 4.0);
206
- S4i2[i] += pow((double)pwi2, 4.0);
207
- }
208
-
209
202
  dcnt++;
210
203
 
211
204
  }

1

コードを文字数制限ギリギリまで可能な限り載せました。検証に必要なデータを作るためのコードも載せました。

2023/04/25 09:47

投稿

yu_89
yu_89

スコア34

test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,4 @@
1
1
  ### 実現したいこと
2
-
3
- c言語のメモリの動的確保について
4
- ### 前提
5
-
6
2
  c言語のmallocによるメモリの動的確保について、気になることがあり質問させていただきます。
7
3
  質問としては、mallocを使いすぎることでメモリを確保する際にmalloc同士で干渉などを起こすことがあるのでしょうか?
8
4
  といのも、以下のコードでは配列を返す自作関数内でmallocを用いてメモリを動的に確保しており、main関数内ではその自作関数を計11回呼び出しています。このプログラムを実行するとコンパイルはできるのですが、実行すると何度やってもセグメンテーションエラーになり、実行できませんでした。しかし、mallocを使っている関数を一部コメントアウトし、main関数内でもコメントアウトした関数の呼び出し部をコメントアウトして実行すると、エラーにならず実行できました。その後、コメントアウトを解除して実行すると今度はセグメンテーションエラーにならずに実行できました。
@@ -14,30 +10,27 @@
14
10
  #include <stdio.h>
15
11
  #include <stdlib.h>
16
12
  #include <math.h>
17
- #include <time.h>
18
13
  #include <string.h>
14
+
15
+ #define N 1024
19
16
 
20
17
  int fft1();
21
18
  int window_func();
22
- int cmpnum();
23
19
 
24
20
  void swap(float *x, float *y);
25
21
 
26
- double* freq(int N);
22
+ double* freq(void);
27
- double* CalcPower(double data[], int N);
23
+ double* CalcPower(double data[]);
28
- double Threshold_kurtosis(double M[], int N);
29
- double Threshold_crossfreq(double median, double sub[], int num);
30
- double* Kurtosis(double a[], double b[], double c[], double d[], int e);
24
+ double* Kurtosis(double a[], double b[], double c[], double d[]);
31
-
32
- double calcMedian();
25
+
33
- double GetRandom(int min, int max);
34
- double pulse(int frame);
35
26
 
36
27
  int main(int argc,const char *argv[])
37
28
  {
38
- int N = 1024;
39
29
  int i, j, k, n, n_frame, iter, flag;
40
-
30
+ int n_frame = 2929;
31
+
32
+ char datar[256], datai[256];
33
+
41
34
  float ar1[N], ai1[N], ar2[N], ai2[N];
42
35
 
43
36
  double pwr1, pwi1, pwr2, pwi2;
@@ -46,12 +39,12 @@
46
39
 
47
40
  double S1r1[N], S2r1[N], S3r1[N], S4r1[N], S6r1[N];
48
41
  double S1i1[N], S2i1[N], S3i1[N], S4i1[N];
49
- double Myu1r1[N], Myu2r1[N], Myu3r1[N], Myu4r1[N], Myu6r1[N];
42
+ double Myu1r1[N], Myu2r1[N], Myu3r1[N], Myu4r1[N];
50
43
  double Myu1i1[N], Myu2i1[N], Myu3i1[N], Myu4i1[N];
51
44
 
52
45
  double S1r2[N], S2r2[N], S3r2[N], S4r2[N], S6r2[N];
53
46
  double S1i2[N], S2i2[N], S3i2[N], S4i2[N];
54
- double Myu1r2[N], Myu2r2[N], Myu3r2[N], Myu4r2[N], Myu6r2[N];
47
+ double Myu1r2[N], Myu2r2[N], Myu3r2[N], Myu4r2[N];
55
48
  double Myu1i2[N], Myu2i2[N], Myu3i2[N], Myu4i2[N];
56
49
 
57
50
  double sub_Myu1r[N], sub_Myu2r[N], sub_Myu3r[N], sub_Myu4r[N];
@@ -59,8 +52,7 @@
59
52
 
60
53
  double Myu21[N], Myu22[N], sub_Myu2[N];
61
54
  double sub_myu2[N], b[N], h[N], h1[N];
62
- double median, median1;
63
- double d[N], d1[N], s;
55
+ double d[N], d1[N];
64
56
  double sub_d[N];
65
57
 
66
58
  double sub_d_neighbor[N], sub_d_neighbor1[N];
@@ -68,25 +60,23 @@
68
60
 
69
61
  double modi_Myu2_freq[N];
70
62
 
71
- double Mr[N], Mi[N], Ma[N], Mb[N], Mc[N];
72
- double Fr[N], Fi[N];
73
- double sum_kr, sum_ki, sum_kc;
74
- double s_k, s_kr, s_ki, s_ka, s_kb, s_kc;
75
- double br[N], bi[N], ba[N], bb[N], qr[N], qa[N];
76
- double xr[N], xi[N], xa[N], xb[N], qi[N], qb[N];
77
-
78
- double modi_Myu2_kur1[N];
79
- double modi_Myu2_kur2[N];
80
-
81
- double com[N];
82
- double modi_Myu2_com[N];
83
-
84
63
  double* fq = NULL;
85
64
 
86
65
  double* Kr = NULL;
87
66
  double* Ki = NULL;
88
67
  double* Ka = NULL;
89
68
  double* Kb = NULL;
69
+
70
+ double Mr[N], Mi[N], Ma[N], Mb[N];
71
+ double Fr[N], Fi[N];
72
+ double br[N], bi[N], ba[N], bb[N], qr[N], qa[N];
73
+ double xr[N], xi[N], xa[N], xb[N], qi[N], qb[N];
74
+
75
+ double modi_Myu2_kur1[N];
76
+ double modi_Myu2_kur2[N];
77
+
78
+ double com[N];
79
+ double modi_Myu2_com[N];
90
80
 
91
81
  double* Myu21_power = NULL;
92
82
  double* sub_Myu2_power = NULL;
@@ -94,27 +84,171 @@
94
84
  double* modi_power_kur1 = NULL;
95
85
  double* modi_power_kur2 = NULL;
96
86
  double* modi_power_freq = NULL;
97
-
87
+
98
- FILE *fp, *fp1, *fp2, *fp3;
88
+ FILE *fp, *fp1;
89
+
90
+ for(i = 0; i < N; i++)
91
+ {
92
+ ar1[i] = 0.0;
93
+ ai1[i] = 0.0;
94
+ ar2[i] = 0.0;
95
+ ai2[i] = 0.0;
96
+
97
+ Myu21[i] = 0.0;
98
+ Myu22[i] = 0.0;
99
+
100
+ S1r1[i] = 0.0;
101
+ S1i1[i] = 0.0;
102
+ S2r1[i] = 0.0;
103
+ S2i1[i] = 0.0;
104
+ S3r1[i] = 0.0;
105
+ S3i1[i] = 0.0;
106
+ S4r1[i] = 0.0;
107
+ S4i1[i] = 0.0;
108
+
109
+ S1r2[i] = 0.0;
110
+ S1i2[i] = 0.0;
111
+ S2r2[i] = 0.0;
112
+ S2i2[i] = 0.0;
113
+ S3r2[i] = 0.0;
114
+ S3i2[i] = 0.0;
115
+ S4r2[i] = 0.0;
116
+ S4i2[i] = 0.0;
117
+
118
+ Myu1r1[i] = 0.0;
119
+ Myu1i1[i] = 0.0;
120
+ Myu2r1[i] = 0.0;
121
+ Myu2i1[i] = 0.0;
122
+ Myu3r1[i] = 0.0;
123
+ Myu3i1[i] = 0.0;
124
+ Myu4r1[i] = 0.0;
125
+ Myu4i1[i] = 0.0;
126
+ }
127
+
128
+ pwr1 = 0.0;
129
+ pwi1 = 0.0;
130
+ pwr2 = 0.0;
131
+ pwi2 = 0.0;
132
+
133
+ dcnt = 0.0;
134
+
135
+ fp = fopen(argv[1],"r");
136
+ fp1 = fopen(argv[2],"r");
137
+
138
+ iter = 0;
139
+ flag = 0;
140
+
141
+ for(n = 0; n < n_frame; n++)
142
+ {
143
+ for(i = 0; i < N; i++)
144
+ {
145
+ fgets(datar, sizeof(datar), fp);
146
+ ar1[i] = atof(datar);
147
+ ar2[i] = 0.0;
148
+ }
149
+
150
+ for(i = 0; i < N; i++)
151
+ {
152
+ fgets(datai, sizeof(datai), fp1);
153
+ ar2[i] = atof(datai);
154
+ ai2[i] = 0.0;
155
+ }
156
+
157
+ window_func(ar1, N);
158
+ window_func(ai1, N);
159
+ fft1(ar1, ai1, N, iter, flag);
160
+
161
+ window_func(ar2, N);
162
+ window_func(ai2, N);
163
+ fft1(ar2, ai2, N, iter, flag);
164
+
165
+ for(i = 0; i < N/2; i++)
166
+ {
167
+ swap(&ar1[i], &ar1[N/2+i]);
168
+ swap(&ai1[i], &ai1[N/2+i]);
169
+ swap(&ar2[i], &ar2[N/2+i]);
170
+ swap(&ai2[i], &ai2[N/2+i]);
171
+ }
172
+
173
+ for(i = 0; i < N; i++)
174
+ {
175
+ pwr1 = ar1[i];
176
+ pwi1 = ai1[i];
177
+
178
+ S1r1[i] += (double)pwr1;
179
+ S1i1[i] += (double)pwi1;
180
+
181
+ S2r1[i] += pow((double)pwr1, 2.0);
182
+ S2i1[i] += pow((double)pwi1, 2.0);
183
+
184
+ S3r1[i] += pow((double)pwr1, 3.0);
185
+ S3i1[i] += pow((double)pwi1, 3.0);
186
+
187
+ S4r1[i] += pow((double)pwr1, 4.0);
188
+ S4i1[i] += pow((double)pwi1, 4.0);
189
+ }
190
+
191
+ for(i = 0; i < N; i++)
192
+ {
193
+ pwr2 = ar2[i];
194
+ pwi2 = ai2[i];
195
+
196
+ S1r2[i] += (double)pwr2;
197
+ S1i2[i] += (double)pwi2;
198
+
199
+ S2r2[i] += pow((double)pwr2, 2.0);
200
+ S2i2[i] += pow((double)pwi2, 2.0);
201
+
202
+ S3r2[i] += pow((double)pwr2, 3.0);
203
+ S3i2[i] += pow((double)pwi2, 3.0);
204
+
205
+ S4r2[i] += pow((double)pwr2, 4.0);
206
+ S4i2[i] += pow((double)pwi2, 4.0);
207
+ }
208
+
209
+ dcnt++;
210
+
211
+ }
212
+
213
+ printf("\n");
214
+ fclose(fp);
215
+ fclose(fp1);
216
+
217
+ fq = freq();
218
+
219
+ for(i = 0; i < N; i++)
220
+ {
221
+ Myu1r1[i] = S1r1[i] / dcnt;
222
+ Myu1i1[i] = S1i1[i] / dcnt;
99
223
 
224
+ Myu2r1[i] = S2r1[i] / dcnt;
225
+ Myu2i1[i] = S2i1[i] / dcnt;
226
+
227
+ Myu3r1[i] = S3r1[i] / dcnt;
228
+ Myu3i1[i] = S3i1[i] / dcnt;
229
+
230
+ Myu4r1[i] = S4r1[i] / dcnt;
231
+ Myu4i1[i] = S4i1[i] / dcnt;
232
+
233
+ Myu21[i] = Myu2r1[i] + Myu2i1[i];
234
+ }
235
+
236
+
237
+ Myu21_power = CalcPower(Myu21);
238
+ sub_Myu2_power = CalcPower(Myu21);
239
+
100
- modi_power_freq = CalcPower(sub_Myu2, N);
240
+ modi_power_freq = CalcPower(Myu21);
101
-
102
-
241
+
103
- Kr = Kurtosis(Myu1r1, Myu2r1, Myu3r1, Myu4r1, N);
242
+ Kr = Kurtosis(Myu1r1, Myu2r1, Myu3r1, Myu4r1);
104
- Ki = Kurtosis(Myu1i1, Myu2i1, Myu3i1, Myu4i1, N);
243
+ Ki = Kurtosis(Myu1i1, Myu2i1, Myu3i1, Myu4i1);
105
-
106
-
107
- Myu21_power = CalcPower(Myu21, N);
244
+
108
- sub_Myu2_power = CalcPower(sub_Myu2, N);
109
-
110
- Ka = Kurtosis(Myu1r2, Myu2r2, Myu3r2, Myu4r2, N);
245
+ Ka = Kurtosis(Myu1r1, Myu2r1, Myu3r1, Myu4r1);
111
- Kb = Kurtosis(Myu1i2, Myu2i2, Myu3i2, Myu4i2, N);
246
+ Kb = Kurtosis(Myu1i1, Myu2i1, Myu3i1, Myu4i1);
112
-
247
+
113
- modi_power_kur1 = CalcPower(modi_Myu2_kur1, N);
248
+ modi_power_kur1 = CalcPower(Myu21);
114
- modi_power_kur2 = CalcPower(modi_Myu2_kur2, N);
249
+ modi_power_kur2 = CalcPower(Myu21);
115
-
250
+
116
- modi_power_com = CalcPower(modi_Myu2_com, N);
251
+ modi_power_com = CalcPower(Myu21);
117
-
118
252
 
119
253
  free(fq);
120
254
  free(Kr);
@@ -132,7 +266,138 @@
132
266
 
133
267
  }
134
268
 
269
+ void swap(float *x, float *y)
270
+ {
271
+ float temp;
272
+
273
+ temp = *x;
274
+ *x = *y;
275
+ *y = temp;
276
+ }
277
+
278
+ int fft1(float ar[], float ai[], int n, int iter, int flag)
279
+ {
280
+ int i, j, it, xp, xp2, k, j1, j2, im1, jm1;
281
+ double sign, w, wr, wi, dr1, dr2, di1, di2, tr, ti, arg;
282
+
283
+ if(n < 2) return(999);
284
+
285
+ if(iter <= 0)
286
+ {
287
+ iter = 0;
288
+ i = n;
289
+
290
+ while(1)
291
+ {
292
+ if((i /= 2) == 0) break;
293
+ iter++;
294
+ }
295
+ }
296
+
297
+ j = 1;
298
+
299
+ for(i = 0; i < iter; i++) j *= 2;
300
+
301
+ if(n != j) return(1);
302
+
303
+ if(flag == 1) sign=1.0;
304
+ else sign=-1.0;
305
+
306
+ xp2 = n;
307
+
308
+ for(it = 0; it < iter; it++)
309
+ {
310
+ xp = xp2;
311
+ xp2 = xp / 2;
312
+ w = 3.141592653589793 / xp2;
313
+
314
+ for(k = 0; k < xp2; k++)
315
+ {
316
+ arg = k * w;
317
+ wr = cos(arg);
318
+ wi = sign * sin(arg);
319
+ i = k - xp;
320
+
321
+ for(j = xp; j <= n; j += xp)
322
+ {
323
+ j1 = j + i;
324
+ j2 = j1 + xp2;
325
+ dr1 = ar[j1];
326
+ dr2 = ar[j2];
327
+ di1 = ai[j1];
328
+ di2 = ai[j2];
329
+ tr = dr1 - dr2;
330
+ ti = di1 - di2;
331
+
332
+ ar[j1] = dr1 + dr2;
333
+ ai[j1] = di1 + di2;
334
+ ar[j2] = tr * wr - ti * wi;
335
+ ai[j2] = ti * wr + tr * wi;
336
+ }
337
+ }
338
+ }
339
+
340
+ j1 = n / 2;
341
+ j2 = n - 1;
342
+ j = 1;
343
+
344
+ for(i = 1; i <= j2; i++)
345
+ {
346
+ if(i < j)
347
+ {
348
+ im1 = i - 1;
349
+ jm1 = j - 1;
350
+ tr = ar[jm1];
351
+ ti = ai[jm1];
352
+
353
+ ar[jm1] = ar[im1];
354
+ ai[jm1] = ai[im1];
355
+ ar[im1] = tr;
356
+ ai[im1] = ti;
357
+ }
358
+
359
+ k = j1;
360
+
361
+ while(k < j)
362
+ {
363
+ j -= k;
364
+ k /= 2;
365
+ }
366
+
367
+ j += k;
368
+ }
369
+
370
+ if(flag == 0) return(0);
371
+
372
+ w = n;
373
+
374
+ for(i = 0; i < n; i++)
375
+ {
376
+ ar[i] = ar[i] / w;
377
+ ai[i] = ai[i] / w;
378
+ }
379
+
380
+ return(0);
381
+ }
382
+
383
+
384
+ int window_func(float frame[], int n)
385
+ {
386
+ int i;
387
+ float winv[n];
388
+ double pi = 3.141592653589793;
389
+
390
+ for(i = 0; i < n; i++)
391
+ {
392
+ winv[i] = 0.35875 - 0.48829 * cos(2.0*pi*i/(n-1)) + 0.14128 * cos(4.0*pi*i/(n-1)) - 0.01168 * cos(6.0*pi*i/(n-1));
393
+
394
+ frame[i] = frame[i] * winv[i];
395
+ }
396
+
397
+ return(0);
398
+ }
399
+
135
- double* CalcPower(double data[], int N)
400
+ double* CalcPower(double data[])
136
401
  {
137
402
  int i;
138
403
  double av[N];
@@ -150,13 +415,13 @@
150
415
  return power;
151
416
  }
152
417
 
153
- double* Kurtosis(double Myu1[], double Myu2[], double Myu3[], double Myu4[], int N)
418
+ double* Kurtosis(double Myu1[], double Myu2[], double Myu3[], double Myu4[])
154
419
  {
155
420
  int i;
156
421
  double M1[N], M2[N], M3[N], M4[N];
157
422
  double top[N], bottom[N];
158
423
  double* K = (double*)malloc(N * sizeof(double));
159
-
424
+
160
425
  for(i = 0; i < N; i++)
161
426
  {
162
427
  M1[i] = 0.0;
@@ -194,7 +459,7 @@
194
459
 
195
460
  }
196
461
 
197
- double* freq(int N)
462
+ double* freq(void)
198
463
  {
199
464
  int i;
200
465
  double* fq = (double*)malloc(N * sizeof(double));
@@ -205,7 +470,41 @@
205
470
  return fq;
206
471
 
207
472
  }
208
-
473
+ ```
474
+ ```C
475
+ #include <stdio.h>
476
+ #include <stdlib.h>
477
+ #include <time.h>
478
+
479
+ #define N 3000000
480
+
481
+ double GetRandom();
482
+
483
+ int main()
484
+ {
485
+ int i;
486
+ FILE *fp, *fp1;
487
+
488
+ fp = fopen("rand1.dat", "w");
489
+ fp1 = fopen("rand2.dat", "w");
490
+
491
+ srand((unsigned int)time(NULL));
492
+ for(i = 0; i < N; i++)
493
+ {
494
+ fprintf(fp, "%f\n", GetRandom(0,1));
495
+ fprintf(fp1, "%f\n", GetRandom(0,1));
496
+ }
497
+
498
+ fclose(fp);
499
+ fclose(fp1);
500
+
501
+ return 0;
502
+ }
503
+
504
+ double GetRandom(int min, int max)
505
+ {
506
+ return min + (double)(rand() * (max - min + 1.0) / (1.0 + RAND_MAX));
507
+ }
209
508
  ```
210
509
 
211
510
  ### 補足情報(FW/ツールのバージョンなど)