好的,所以我得到这个代码来进行平均:(用C语言编写)
.
.
int sum[3];
int j;
int avg;
for(;;) //infinite loop
{
for(j=0;j<3;j++){
i = ReadSensor(); // function that keeps saving sensor values as int i
sum[j]=i;
}
avg=sum[0]+sum[1]+sum[2]+sum[3];
printf("Sonar: %d \r \n", avg >> 2);
}
.
.
这是对的吗?我移动2除以avg / 2 ^(2)即4 问题是我期待大约15的价值,但我得到大约8--9 ..我不知道为什么会发生这种情况?
基本上传感器的读数在15-17之间波动,我想获得平均值而不是打印噪声值。我的代码是否正确?那我为什么输错了??
答案 0 :(得分:3)
看起来你的脚本只捕获三个值(j = 0,j = 1,j = 2),然后除以4。
答案 1 :(得分:3)
你有一些问题,这里有一些建议:
for
循环更改为:for (j = 0; j < 4; j++)
。sum
是一个包含3个元素的数组,但在计算avg
(sum[3]
)时,您正在访问数组末尾的元素1。这将导致未定义的行为。出于这个原因,我应该将sum
声明为char sum[4]
。sum
在上面的示例中不需要是数组,它可以只是int
。int
除以4,请使用除法运算符。编译器应该更好地优化您的特定体系结构的代码而不是您。这是您的代码现在的样子,具体取决于您是否需要保留数组:
int sum[4];
int total, j;
for (;;)
{
total = 0; /* reset at every iteration of the outside loop */
for (j = 0; j < 4; j++) {
sum[i] = ReadSensor();
total += sum[i];
}
printf("Sonar: %d \r \n", total / 4);
}
OR
int total, j;
for (;;)
{
total = 0; /* reset at every iteration of the outside loop */
for (j = 0; j < 4; j++)
total += ReadSensor();
printf("Sonar: %d \r \n", total / 4);
}
答案 2 :(得分:2)
不是这个
avg=sum[0]+sum[1]+sum[2]+sum[3];
应该是
avg=sum[0]+sum[1]+sum[2];
作为循环以及声明int sum[3];
意味着我们只尝试存储3个值。
现在,如果你想要4并且可以使用除法运算符。有新代码应该替换上面提到的行
int sum[4];
for(j=0;j<4;j++)
avg=sum[0]+sum[1]+sum[2]+sum[3]; // this part stays the same
答案 3 :(得分:1)
从传感器读取的值的数量需要两次。首先,控制for
循环的迭代次数。第二,作为总和的除数。引入一个变量(比如N
)来捕获它。
此外,通过移位划分听起来不对,因为这会将传感器的读数限制为2的幂。
enum { N = 4 };
sum = 0;
for( j = 0; j < N; j++) {
i = ReadSensor(); // function that keeps saving sensor values as int i
sum += i;
}
avg = sum / N;
printf( "Sonar average: %d\n", avg );