一時的で散発的な動作を示していたコードをデバッグする必要がありました。これは、最終的に初期化の行で初期化されていないフロートに起因する可能性があります。
float a = number, b, c = other_number;
コードのこのセクションでは、シリアル接続を介してデバイスをすばやくサンプリングし、一定の間隔で出力を平均化していました。たまに 2.7916085e+035という数字が報告されますが、そうでなければコードは意図したとおりに機能し、バグは再現できませんでした。
数値は常に2.7916085e+035だったので、通信処理またはデバイス自体に問題があるのではないかと考えましたが、それらは除外されました。デバッガーで問題のあるサンプルを最終的に見つけるまで、外部干渉のせいにする準備がほとんどできていました。
では、質問に。誰かが2.7916085e+035の重要性を仮定できますか? 私の文脈の外でそれが意味を持っているかどうかはわかりませんが、私を悩ませているのは、この数が本質的に再現不可能なほど再現可能だったことです. つまり、問題を確実に再現することはできませんでしたが、問題が発生したときは常に同じでした。私の理解では、初期化されていない変数は不確定であると想定されています。この問題は、プログラムの実行、フェーズ、時刻などのさまざまな場所で発生しましたが、常に同じシステムで発生したことに注意してください。
動作の原因となった .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
平均ごとに 1 回再宣言されます。これは、秒、分、時間、または条件が満たされるたびに発生する可能性があり、平均を取ります。多くの場合、変数は 0 になりますが、上記の数値になることもあります。