我有一个简单的功能
#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。怎么了?
答案 0 :(得分:2)
[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
。