我不得不调试一些表现出瞬态和零星行为的代码,这最终可能归因于初始化行中未初始化的浮点数,即:
float a = number, b, c = other_number;
这部分代码通过串行连接对设备进行快速采样,并在某个时间间隔内平均输出。每隔一段时间,就会报告 数字2.7916085e+035 ,但否则代码会按预期工作,并且该错误不可重现。
由于数字始终为2.7916085e+035,我认为通信处理或设备本身可能存在一些问题,但这些被排除在外。我几乎准备把它归咎于外部干扰,直到我终于在调试器中发现了一个错误的样本。
所以,对于这个问题。有人可以假设2.7916085e+035的重要性吗?我不确定它在我的上下文之外是否有任何意义,但令我困扰的是这个数字本质上是不可重现的reproducible。也就是说,我无法可靠地复制问题,但是当它出现时,它总是一样的。据我了解,未初始化的变量应该是不确定的。值得注意的是,问题发生在程序执行、阶段、一天中的时间等的所有不同位置……但总是在同一个系统上。
.NET 框架、运行时或操作系统中是否存在导致该行为的内容?这特别难以追踪,因为未初始化的变量总是具有相同的值,而幸运的是它没有被设置为 0。
编辑:一些上下文。代码在一个具有可变滴答率的计时器内,因此变量是类的本地非静态成员:
if(//some box checked)
{
switch(//some output index)
{
case problem_variable:
{
if(ready_to_sample)
{
float average;
for each(float num in readings)
{
average += num;
}
average /= readings.Count;
}
}
}
}
这里有问题的变量是average
. readings
是我想要平均的输出列表。average
将被重新声明一次……平均,这可以在几秒、几分钟、几小时内发生,或者在满足条件时取平均值。变量通常会得到 0,但偶尔会得到上面的数字。