私は現在いくつかのコードに取り組んでおり、これまではすべてが正常にコンパイルされています。コードの目的は次のとおりです。
- データファイルから入力を読み取り、配列に値を割り当てます。
- 特定の間隔のデータの平均を取り、その間隔の各値を平均に置き換えることにより、「データを平滑化」します。
それは私に問題を引き起こしている2番目の部分です。外部関数では、何らかの理由で、「for」ループが次のようになっている場合に機能します。
for(i=t; i<t+z; i++)
しかし、私はそれをしたくありません。私はそれがこれをしたい:
for(i=t*z; i<(t+1)*z; i++)
コンパイルしようとすると、クラッシュします。誰もがその理由を知っていますか?何時間も私を困惑させてきました。ちなみに、すべてのコードを以下に示します。
#include <stdio.h>
#include <stdlib.h>
float foo(float*, int, int);
int main(int argc, char* argv[])
{
FILE *input;
const char datafile[]="datainput.dat";
input=fopen(datafile, "r");
int i;
int N=0, t=0;
int z=100;
int M=10;
float *a, avg;
a=(float*)malloc(M*sizeof(float));
if((input!=(FILE*) NULL))
{
while(fscanf(input, "%e", &a[t++])==1)
{
if (t>=M)
{
M*=2;
a=(float *)realloc(a, M*sizeof(float));
}
N++;
}
float u[N];
for(t=0; t<N; t++)
{
avg = foo(a, z, t);
u[t] = avg;
}
fclose(input);
}
else
printf("Input file could not be opened.\n");
return(0);
}
float foo(float b[], int z, int t)
{
int i;
int k=0;
float avg;
float sum=0;
for(i=t*z; i<(t+1)*z; i++)
{
sum+=b[i];
k++;
}
avg = sum/(float)k;
return(avg);
}
補足:コードの途中でfloatu[N]を定義するという不適切な方法に気付くでしょう。これが存在するのはあまり好きではありませんが、Nは入力ファイル(最初は不明)の値の数をカウントする変数であり、最初はN = 0に設定されているため、方法がわかりません。私はそれを回避します。
さらに、ここで先に質問しましたが、失敗した場合、reallocには句がありません。それは私が取り組んでいるものですが、現時点ではそこになくてもコンパイルされます。
また、すべてのデータ値は、小数点以下7桁の浮動小数点形式であり、科学的記数法であるため、%eです。
ありがとうございました!
編集:ここにデータファイルからの値のいくつかがあります。左側の値は順序付けられているように見えますが、これらはファイル内の実際の値であり、右側の値を示すものではありません。
8.0800000e+00 7.0872796e-01
8.0900000e+00 7.1941101e-01
8.1000000e+00 2.1635408e+00
8.1100000e+00 -5.4200807e-01
8.1200000e+00 1.1046968e+00
8.1300000e+00 1.5833782e+00
8.1400000e+00 6.6122899e-01
8.1500000e+00 1.7922273e+00
8.1600000e+00 1.2446803e+00
8.1700000e+00 3.7869871e-01
8.1800000e+00 1.4793635e+00
8.1900000e+00 1.0508171e+00
8.2000000e+00 9.1012735e-01
8.2100000e+00 6.0967729e-01
8.2200000e+00 1.3834455e+00
8.2300000e+00 -5.2312924e-01
8.2400000e+00 9.2566688e-01
8.2500000e+00 7.8145188e-01
8.2600000e+00 4.1410150e-01
8.2700000e+00 1.9796986e+00
8.2800000e+00 5.9372874e-01
8.2900000e+00 1.8696331e+00
8.3000000e+00 2.3058409e+00