我目前正在编写一些代码,到目前为止,一切都编译得很好。代码的目的是这样的:
- 从数据文件中读取输入并将值分配给数组。
- 通过对给定间隔内的数据取平均值并将该间隔中的每个值替换为平均值来“平滑数据”。
这是给我带来麻烦的第二部分。在外部函数中,由于某种原因,当我的“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);
}
旁注:您可能会注意到在代码中途定义 float u[N] 的不良做法。我真的不喜欢这样,但你会注意到 N 是一个变量,它计算输入文件中的值的数量(最初未知)并且最初设置为 N=0,所以我不确定如何我解决了这个问题。
另外,我之前在这里问过这个问题,但是如果我的 realloc 失败了,它就没有子句。这是我正在做的事情,但目前它在没有它的情况下编译。
此外,所有数据值的形式都是浮点数,有七位小数,采用科学计数法,因此是 %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