В некоторых комментариях указывалось, что вы рискуете переполниться во время суммирования. Если это 16-битный компьютер, INT_MAX равен 32767. В соответствии с вашим примером, вы не приближаетесь к этому, но с этим нужно быть осторожным.
В любом случае, вы собираете значения в массив floats
:
float pHsensor_output[40];
...
pHsensor_output[i] = ADC_Read(1);
Но позже передать его функции, ожидающей массив int
s:
double Average(int* arr, int number)
...
avepH = Average(pHsensor_output, 40);
(Тот факт, что Average
вычисляется с помощью int
s и возвращает double
означает, что вы могли бы получить усеченный ответ, но здесь проблема не в этом.)
Ваш компьютер сейчас просматривает комбинацию битов, которая может быть «633» при просмотре как число с плавающей точкой, но почти наверняка не будет при просмотре как целое число. Итак, кто знает, каков будет результат, если вы возьмете их среднее значение?!
Попробуйте изменить свою функцию на что-то вроде:
double Average(float* arr, int number)
{
int i;
double ave;
double sum = 0.0; // NOTE: not arr[0];
for(i = 0;i<number;i++)
{
sum=sum+arr[i];
}
ave = sum/number;
return ave;
}
Приложение: ваш компилятор действительно должен был жаловаться на это. Это действительно молчал? G CC немедленно barfs.
error: cannot convert ‘float*’ to ‘int*’ for argument ‘1’ to ‘double Average(int*, int)’
Редактировать: Всегда приятно понимать , видя, поэтому я попробовал небольшой пример. У меня рабочий стол, а не PI C, поэтому int
32-битный, а не 16, но, надеюсь, суть та же ....
int main()
{
union {
float my_float;
int my_int;
} hack;
printf ("sizeof(float) %lu, sizeof(int) %lu\n", sizeof(float), sizeof(int));
hack.my_float = 633.0;
printf( "%f -> %d\n", hack.my_float, hack.my_int );
int sum = 40 * hack.my_int;
int average = sum / 40;
printf( "sum %d --> %d\n", sum, average );
return 0;
}
Выход:
sizeof(float) 4, sizeof(int) 4
633.000000 -> 1142833152
sum -1531314176 --> -38282854
Это «показывает», что хороший float
становится сумасшедшим int
(когда один и тот же шаблон битов рассматривается по-разному 1 ), и после этого все ставки отключаются. Очевидно, что суммирование переполняется, и, следовательно, среднее получается отрицательным; совсем не то, что вы ожидали!
1 «Объединенный взлом», который я использовал в моем примере, говорит компьютеру: «Возьмите ячейку памяти, содержащую float
, и посмотрите в точно таких же битах, но притворяются, что это int
. Это то, что происходит, когда вы передаете указатель на некоторые числа с плавающей запятой функции, ожидающей указатель на целые числа.
Но если вы выполняете присваивание «чисто», вы получите то, что ожидаете:
int nice_int = hack.my_float; // 633.0
printf( "good %f -> %d\n", hack.my_float, nice_int );
доходность:
good 633.000000 -> 633