質問編集履歴
2
修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
下記プログラムにてヒープは壊れていますとエラーが出ます。
|
2
|
+
(修正:現在は「読み取り中にアクセス違反が発生」と表示されます)
|
2
|
-
|
3
|
+
配列xをS_fftのakに渡すときにサイズを超えている(?)のが原因だと思うのですが、
|
3
|
-
|
4
|
+
対処法が分かりません。ヒントをください。
|
4
5
|
エラー箇所はmain関数内の三番目のfor文の中です。
|
5
6
|
#エラー内容
|
6
|
-
ハンドルされない例外が
|
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("
|
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
|
-
|
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
誤字
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++) {
|
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);
|