C不解析数组第一个元素-AVR GCC

C不解析数组第一个元素-AVR GCC,c,avr-gcc,C,Avr Gcc,代码非常简单,我存储最后10个值并输出平均值。 但是,数组的0元素保持不变,初始化值为“0” long int avg[10] = {0,0,0,0,0,0,0,0,0,0}; int i; float temp2; for (i=0;i<9;i++){ avg[i] = avg[i+1]; //shift all values to the left } avg[9] = temp2; //temp2 is the last value temp2 =

代码非常简单,我存储最后10个值并输出平均值。 但是,数组的0元素保持不变,初始化值为“0”

long int avg[10] = {0,0,0,0,0,0,0,0,0,0};
int i;
float temp2;

for (i=0;i<9;i++){
   avg[i] = avg[i+1];    //shift all values to the left
}
avg[9] = temp2;          //temp2 is the last value

temp2 = 0;               //i am reusing temp2 as mean result

for (i=0;i<10;i++){
   temp2 += avg[i];
}

temp2 /= 10;
等等

虽然在多次运行后,值应该已填充到表格中,但表格始终具有以下形式:

0  251  252  248  250  247  253  252  248  247
我希望我说得更清楚

-编辑2:

你为什么否决我的问题?是因为你不明白吗? 哪个严重的编译器会在没有错误/警告我没有初始化temp2的情况下编译它?由于这个原因出现此问题的概率是多少?

您没有初始化int temp2。这就是为什么你会得到这样的结果

int temp2 = 0;
avg[9] = temp2;

你的代码看起来不错。它应该做它应该做的事情。这就是为什么bug可能在您没有展示给我们的部分。可能是某些越界写入会覆盖avg[0]

我注意到两件事: 你混合了浮点和整数。我怀疑你真的需要这里的花车。因为您将输入浮点存储在int变量中。因此,将处理完全保持在int中,只在float中进行最后的除法,但我也认为使用int作为平均值应该足够了

另一件事是,您可以将求和集成到第一个循环中,并在最后添加新值

long sum =0;
for (i=0;i<9;i++){
   avg[i] = avg[i+1];    //shift all values to the left
   sum +=avg[i]; 
}
avg[9] = temp2;          //temp2 is the last value
sum += avg[9];

编辑:另外两个效率提示:ADC仅输出10位值。所以平均值可以是整数。此外,16位对于累加器也足够了。如果使用2的幂,即使使用float,分割速度也要快得多。因此,您可能会平均超过8或16个值。

这还不清楚。请构造一个实际演示这一点的测试用例。什么是temp2?在哪里初始化?将结果除以9-什么结果?将加法结果除以temp2。这是因为如果平均值[0]为0,那么得到平均值的实际值为9。这就是为什么它是一个变通方法,它不是我的全部代码。谢谢你的意见,尽管你的建议很有帮助,谢谢。这是avg被访问的代码的唯一部分,这就是为什么我不知道为什么会发生这种情况。使用float是因为我必须在之后对值进行转换,但我想将最终结果转换为float会更有效。再次感谢
long sum =0;
for (i=0;i<9;i++){
   avg[i] = avg[i+1];    //shift all values to the left
   sum +=avg[i]; 
}
avg[9] = temp2;          //temp2 is the last value
sum += avg[9];