У меня есть простая функция
#define AMB_FILTER 0.7f
int32_t fValue; (this is declared in the class header)
int32_t Ambient::filter(uint32_t raw)
{
// If we have no preliminary fValue we don't need to calculate a filter
if(fValue == -1)
{
fValue = raw;
return fValue;
}
float y, yy;
y = (1.0f - AMB_FILTER) * (float) raw;
yy = AMB_FILTER * (float) fValue;
fValue = (int32_t) (y + yy);
printf("filter raw %d y %f yy %f fValue %d\n",raw, y, yy, fValue);
return fValue;
}
Он принимает значение, которое было прочитано из SMBus и возвращает значение, которое было отфильтровано с последним полученным значением. Вот его вывод из оператора printf
filter raw 454 y 136.200012 yy 317.799988 fValue 454
filter raw 454 y 136.200012 yy 317.799988 fValue 454
filter raw 454 y 136.200012 yy 317.799988 fValue 454
filter raw 455 y 136.500000 yy 317.799988 fValue 454
filter raw 455 y 136.500000 yy 317.799988 fValue 454
filter raw 455 y 136.500000 yy 317.799988 fValue 454
filter raw 455 y 136.500000 yy 317.799988 fValue 454
filter raw 455 y 136.500000 yy 317.799988 fValue 454
filter raw 454 y 136.200012 yy 317.799988 fValue 454
filter raw 455 y 136.500000 yy -731751040.000000 fValue -731750912
filter raw 455 y 136.500000 yy -512225632.000000 fValue -512225504
filter raw 455 y 136.500000 yy -358557856.000000 fValue -358557728
filter raw 455 y 136.500000 yy -250990400.000000 fValue -250990256
filter raw 454 y 136.200012 yy -175693184.000000 fValue -175693040
Так что же происходит? Как получилось, что он все еще получил тот же вклад, но вдруг сошел с ума? Я нигде не устанавливаю значение fValue, кроме этой функции.
Я сделал эти переменные (y и yy) очень усвоенными для функции, потому что я волновался, что они каким-то образом изменяются или сталкиваются с чем-то другим. Но теперь, когда они полностью местные, я понятия не имею, что происходит. Я использую классы C ++, так что все равно должно быть в своем собственном пространстве.
РЕДАКТИРОВАТЬ: Фактически, если я позволю ему работать немного дольше, переменные, которые я сохраняю для различных адресов чипа i2c, также будут повреждены до -1075766188. Что за черт?
[t1] filter raw 454 y 136.200012 yy 317.799988 fValue 454 [t2] filter raw 455 y 136.500000 yy -731751040.000000 fValue -731750912
Где-то между t1 а также t2 значение fValue
был поврежден. Коррупция yy
является следствием fValue
коррупция. Поищите виновника в другом месте вашей программы.
valgrind
, а затем посыпать проверки здравомыслия на значение fvalue
на протяжении всей вашей программы.this
в вашей рутине. Посмотрите, станет ли это необычным.Ambient
, Посмотрите, станут ли они необычными.Что касается того, как он был поврежден, существует много возможностей. Возможно, вы разыменовали дикий указатель где-то. Возможно, вы пишете за пределами массива. Возможно, вы работаете на ранее разрушенном Ambient
,
Других решений пока нет …