アプリ版:「スタンプのみでお礼する」機能のリリースについて

学校の課題で,二つのファイルから得たデータで相互相関関数を計算する,という課題がでました.
以下のようなプログラムを書いたのですが,コンパイルの時点でエラーはなく,実行したときに
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);
}

A 回答 (2件)

N_xとかに値いれる前に


メモリ確保に使ってるよね。
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます!理解できました
etime_xなどを定義する前に,fgetsでN_xなどに値いれなければってことですよね!

お礼日時:2021/01/15 22:51

>この原因がもしわかれば教えていただきたいです.


プログラムが不適切だから。

>malloc(): corrupted top size
etime_x = (float*)malloc(sizeof(float)*N_x);
でsizeof(float)*N_xが幾つだか考える。

>aborted (core dumped)
etime_xが何処を指すか考える。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます.
考えてみたのですが,その文の書いてある場所が変だということでしょうか.

お礼日時:2021/01/12 12:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A