teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

修正

2021/03/05 01:50

投稿

Anfaenger
Anfaenger

スコア14

title CHANGED
File without changes
body CHANGED
@@ -1,9 +1,10 @@
1
1
  下記プログラムにてヒープは壊れていますとエラーが出ます。
2
+ (修正:現在は「読み取り中にアクセス違反が発生」と表示されます)
2
- メモリ動的確保したこが失敗の原因だと思うのですが、メモリの扱いが初心者で
3
+ 配列xS_fftのakに渡すきにサイズを超えている(?)原因だと思うのですが、
3
- 原因を特定できません。ヒントをください。
4
+ 対処法が分かりません。ヒントをください。
4
5
  エラー箇所はmain関数内の三番目のfor文の中です。
5
6
  #エラー内容
6
- ハンドルされない例外が 0x77C7FC3D (ntdll.dll) で発生しました(WAVFFT.exe 内): 0xC0000374: ヒープは壊れています。 (パラメーター: 0x77CBB960)
7
+ ハンドルされない例外が 0x77BF0F01 (ntdll.dll) で発生しました(WAVFFT02.exe 内): 0xC0000005: 場所 0x000010A5 の読み取り中にアクセス違反が発生しました
7
8
  ```C++
8
9
  #include <stdio.h>
9
10
  #include <math.h>
@@ -41,7 +42,7 @@
41
42
 
42
43
  WAV_PRM prm_in;
43
44
  double* data;
44
- FILE* audio = fopen("mansample.wav", "rb");
45
+ //FILE* audio = fopen("sinwave.wav", "rb");
45
46
  FILE* txt = fopen("mansample.txt", "w");
46
47
  char fn[] = "mansample.wav";
47
48
 
@@ -56,7 +57,7 @@
56
57
  sc = 2.0 * PI * dt;
57
58
  for (i = 0; i < N; i++) {
58
59
  if (x != NULL && y != NULL) {
59
- // x = audio_read(&prm_in, fn);
60
+ // x = audio_read(&prm_in, fn);
60
61
  y[i] = 0.0;
61
62
  }
62
63
  }
@@ -64,6 +65,8 @@
64
65
  printf("STG 02\n");
65
66
  // Fourier変換
66
67
 
68
+ printf("Size of Data : %d\n", sizeof *x);
69
+
67
70
  S_fft(x, y, N, -1);
68
71
 
69
72
  printf("STG 03\n");
@@ -71,18 +74,18 @@
71
74
  //for (i = 0; i < Fr; i++) printf(" i=%d %f %f \n", i, x[i], y[i]);
72
75
 
73
76
  // 計算結果をファイルに格納
74
-
77
+
75
- for (i = 0; i < N; i++) {
78
+ for (i = 0; i < N / 2; i++) {
76
79
  if (x != NULL && y != NULL) {
77
80
  pw = sqrt(x[i] * x[i] + y[i] * y[i]) * 100; // パワースペクトル
78
81
  }
79
82
  fq = i / (dt * Fr) * 2.2; // 周波数
80
83
  //printf("%f = %d / (%f * %d)\n", fq, i, dt, N);
81
- fprintf(txt, "%fHz %d\n", fq, pw); /* エラー箇所 */
84
+ fprintf(txt, "%fHz %d\n", fq, pw); // エラー箇所
82
85
  }
83
86
  printf("STG 04\n");
84
87
  //fclose(fp);
85
- fclose(audio);
88
+ //fclose(audio);
86
89
  fclose(txt);
87
90
  free(x);
88
91
  free(y);
@@ -98,8 +101,12 @@
98
101
  int i, j, k, k1, num, nhalf, phi, phi0;
99
102
  static int rot[N];
100
103
  double s, sc, c, a0, b0, tmp;
104
+
101
105
  for (i = 0; i < n; i++) rot[i] = 0;
102
106
 
107
+ //ak = (double*)malloc(sizeof(double) * N);
108
+ //bk = (double*)malloc(sizeof(double) * N);
109
+
103
110
  nhalf = n / 2; num = n / 2; sc = 2.0 * PI / n;
104
111
  while (num >= 1) {
105
112
  for (j = 0; j < n; j += 2 * num) {
@@ -107,7 +114,7 @@
107
114
  c = cos(sc * phi); s = sin(sc * phi * ff);
108
115
  for (k = j; k < j + num; k++) {
109
116
  k1 = k + num;
110
- if (ak != NULL) {
117
+ if (ak != NULL && bk != NULL) {
111
118
  a0 = ak[k1] * c - bk[k1] * s;
112
119
  b0 = ak[k1] * s + bk[k1] * c;
113
120
  ak[k1] = ak[k] - a0; bk[k1] = bk[k] - b0;
@@ -118,14 +125,14 @@
118
125
  }
119
126
  num = num / 2;
120
127
  }
121
- if (ff < 0 && ak != NULL) {
128
+ if (ff < 0 && ak != NULL && bk != NULL) {
122
129
  for (i = 0; i < n; i++) {
123
130
  ak[i] /= n; bk[i] /= n;
124
131
  }
125
132
  }
126
133
 
127
134
  for (i = 0; i < n - 1; i++) {
128
- if ((j = rot[i]) > i && ak != NULL) {
135
+ if ((j = rot[i]) > i && ak != NULL && bk != NULL) {
129
136
  tmp = ak[i]; ak[i] = ak[j]; ak[j] = tmp;
130
137
  tmp = bk[i]; bk[i] = bk[j]; bk[j] = tmp;
131
138
  }
@@ -208,7 +215,8 @@
208
215
 
209
216
  fread(data_ID, 1, 4, fp);
210
217
 
211
- fread(&data_size, 4, 1, fp);
218
+ //fread(&data_size, 4, 1, fp);
219
+ fread(&data_size, sizeof(unsigned char), 4, fp);
212
220
 
213
221
 
214
222
 

1

誤字

2021/03/05 01:49

投稿

Anfaenger
Anfaenger

スコア14

title CHANGED
File without changes
body CHANGED
@@ -54,7 +54,7 @@
54
54
  int pw = 0;
55
55
  printf("STG 01\n");
56
56
  sc = 2.0 * PI * dt;
57
- for (i = 0; i < N; i++) { // 1Hzに60Hzのノイズが重なった波形の例
57
+ for (i = 0; i < N; i++) {
58
58
  if (x != NULL && y != NULL) {
59
59
  // x = audio_read(&prm_in, fn);
60
60
  y[i] = 0.0;
@@ -78,7 +78,7 @@
78
78
  }
79
79
  fq = i / (dt * Fr) * 2.2; // 周波数
80
80
  //printf("%f = %d / (%f * %d)\n", fq, i, dt, N);
81
- fprintf(txt, "%fHz %d\n", fq, pw);
81
+ fprintf(txt, "%fHz %d\n", fq, pw); /* エラー箇所 */
82
82
  }
83
83
  printf("STG 04\n");
84
84
  //fclose(fp);