0

私は簡単な機能を持っています

#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に破損します。なんてこったい?

4

1 に答える 1

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

t1t2の間に、 の値fValueが壊れていました。の破損yyは、 の破損の結果ですfValue。プログラムの他の場所で原因を探します。

  • を使用できない場合は、プログラム全体valgrindで値の健全性チェックを振りかけfvalueます。
  • thisルーチンでの値を出力します。異常になるかどうかを確認します。
  • から他のメンバー変数の値を出力しますAmbient。それらが異常になるかどうかを確認します。
  • 大量のコードをコメントアウトしてみてください。プログラムの 1/2 から始めます。バグがまだある場合は、残りの 1/2 をコメントアウトします。破損を制御する単一の行が見つかるまで続行します。

どのように破損したかについては、多くの可能性があります。おそらく、どこかでワイルド ポインターを逆参照している可能性があります。おそらく、配列の末尾を超えて書き込みます。おそらく、以前に破棄されたAmbient.

于 2012-11-09T15:44:05.300 に答える