
学校の課題で,二つのファイルから得たデータで相互相関関数を計算する,という課題がでました.
以下のようなプログラムを書いたのですが,コンパイルの時点でエラーはなく,実行したときに
malloc(): corrupted top size
Aborted (core dumped)
というエラーがでてきます.
この原因がもしわかれば教えていただきたいです.
また,他にもおかしな点があれば教えてください.
よろしくお願いいたします.
以下,プログラム
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#define BUF_SIZE 4000
int main()
{
/* open file */
FILE *fp_x = fopen("ecg400.txt", "r");
if (fp_x == NULL){
printf("Can't open data file.\n");
return 1;
}
FILE *fp_y = fopen("ecg4000.txt", "r");
if (fp_y == NULL){
printf("Can't open data file.\n");
return 1;
}
/* read data */
char buf[BUF_SIZE];
int N_x = 0, N_y = 0, k, y;
int a = 0, a2 = 2, b;
int line = 3000000;
float *etime_x, *resp_x, *etime_y, *resp_y, *resp2_x, *resp2_y;
float m = 0, *d, *e, *f, *peak;
float r, time_ave, bpm_ave;
etime_x = (float*)malloc(sizeof(float)*N_x);
resp_x = (float*)malloc(sizeof(float)*N_x);
etime_y = (float*)malloc(sizeof(float)*N_y);
resp_y = (float*)malloc(sizeof(float)*N_y);
fgets(buf, BUF_SIZE-1, fp_x);
sscanf(buf, "%d\n", &N_x);
fgets(buf, BUF_SIZE-1, fp_y);
sscanf(buf, "%d\n", &N_y);
for (int i = 0; i < N_x ; i++ ){
fgets(buf, BUF_SIZE-1, fp_x);
sscanf(buf, "%f,%f\n", &etime_x[i], &resp_x[i]);
}
for (int i = 0; i < N_y ; i++ ){
fgets(buf, BUF_SIZE-1, fp_y);
sscanf(buf, "%f,%f\n", &etime_y[i], &resp_y[i]);
}
b = N_y - N_x;
resp2_x = (float*)malloc(sizeof(float)*N_x);
resp2_y = (float*)malloc(sizeof(float)*N_y);
peak = (float*)malloc(sizeof(float)*b);
d = (float*)malloc(sizeof(float)*(b+1));
e = (float*)malloc(sizeof(float)*(b+1));
f = (float*)malloc(sizeof(float)*b);
printf("ノイズ除去(移動平均処理)しますか?(はい→1)\n");
scanf("%d", &y);
/* ノイズ除去するとき */
if(y == 1){
for(int i = a2-1; i <= N_x-1; i++ ){
for(int j = 0; j <= a2-1; j++ ){
resp2_x[i] += resp_x[i-j];
}
resp2_x[i] /= a2;
}
for(int i = a2-1; i <= N_y-1; i++ ){
for(int j = 0; j <= a2-1; j++ ){
resp2_y[i] += resp_y[i-j];
}
resp2_y[i] /= a2;
}
for(int i = a2-1; i <= N_x-1; i++ ){
resp_x[i] = resp2_x[i];
}
for(int i = a2-1; i <= N_y-1; i++ ){
resp_y[i] = resp2_y[i];
}
a = a2 - 1;
}
for(int i = a; i <= N_y-1; i++ ){
m += resp_y[i];
}
m /= (N_y - a);
for(int i = a; i <= N_x-1; i++){
resp_x[i] -= m;
}
for(int i = a; i <= N_y-1; i++){
resp_y[i] -= m;
}
for(int i = 0 ; i <= b ; i++){
for(int j = a; j <= N_x-1; j++){
d[i] += resp_x[j] * resp_y[j+i];
}
}
for(int i = 1; i <= b ; i++){
e[i] = d[i] - d[i-1];
}
for(int i = 1; i <= (b - 1) ; i++){
f[i] = e[i]*e[i+1];
}
for(int i = 1; i <= (b - 1) ; i++){
if(f[i] < 0){
if(d[i] >= line){
peak[k] = etime_y[i];
k++;
}
}
}
for(int i = 1; i <= k-1; i++){
r = peak[i] - peak[i-1];
printf("R波間隔%d:%f\n", i, r);
}
time_ave = (peak[k-1] - peak[0])/5;
bpm_ave = 60/time_ave;
printf("R波間隔の平均値:%f\n", time_ave);
printf("心拍数:%f\n", bpm_ave);
fclose(fp_x);
fclose(fp_y);
free(etime_x);
free(resp_x);
free(resp2_x);
free(etime_y);
free(resp_y);
free(resp2_y);
free(d);
free(e);
free(f);
free(peak);
}
No.2ベストアンサー
- 回答日時:
N_xとかに値いれる前に
メモリ確保に使ってるよね。
ご返信ありがとうございます!理解できました
etime_xなどを定義する前に,fgetsでN_xなどに値いれなければってことですよね!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C++ と、 1 2022/11/07 23:45
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
このQ&Aを見た人はこんなQ&Aも見ています
-
C 開放してるのにエラー(double free or corruption (!prev))がでる
C言語・C++・C#
-
C++でアボート(Abort)で処理が強制終了してしまう
C言語・C++・C#
-
メモリのセグメント違反の解決方法を教えてください。
C言語・C++・C#
-
-
4
C言語 配列の長さの上限
C言語・C++・C#
-
5
バッファとは何ですか
C言語・C++・C#
-
6
メモリアロケーション異常の発生方法
C言語・C++・C#
-
7
std::set<int> で、ある値が何番目の数なのか知る方法
C言語・C++・C#
-
8
C言語のポインターに関する警告
C言語・C++・C#
-
9
C言語の配列をPush(追加)するには
C言語・C++・C#
-
10
C言語のポインターで詰まっている
C言語・C++・C#
-
11
至急です! マクロ定義で #define NUMBER 10とし 関数で max(double ma
C言語・C++・C#
-
12
実行プログラム名の取得
C言語・C++・C#
-
13
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
14
セグメントエラー
C言語・C++・C#
-
15
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
16
構造体のメンバをfor文で回したい
C言語・C++・C#
-
17
C言語での引数の省略方法
C言語・C++・C#
-
18
再起呼び出しの回数をカウントするプログラム
C言語・C++・C#
-
19
複数桁10進数の*桁目だけを抽出したい
C言語・C++・C#
-
20
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
リッチテキストへの行ごとの背...
-
C言語で分からないところがあり...
-
商と剰余を同時に求める(C言語)
-
VB6.0でコンピュータ名の取得
-
外積のプログラムについて質問...
-
gccで64ビット整数
-
List<T>のタイプを調べる方法は?
-
n進数を10進数に変換するプログ...
-
【C++】行列データの読み込み
-
(マルチスレッド)_beginthrea...
-
線形探索について
-
単方向リストに適当な値を入れ...
-
剰余演算を論理演算と加減算に...
-
C言語 エラーの原因がわからな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
C言語 エラーの原因がわからな...
-
(int *)の意味
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
windows-findstrの正規表現を使...
-
C言語で分からないところがあり...
-
int型の変数値をバイト列として...
-
PowerShellがうまくいかない
-
C言語での奇数の和
-
「{ } で囲むだけ」は正しい?
-
std::set<int> で、ある値が何...
-
実数の整数部,小数部の取得
-
エラー 添字が付けられた値が、...
-
int16_t の _t は何?
おすすめ情報