0

コードは次のようになります。

if (chan->sampcnt < 8)
{
    *data = 0;
    return;
}

chan有効な構造体へのポインタが含まれています。デバッガーでは、リストされている値`chan->sampcntは です-3。どういうわけか、条件を false として解決せず、if ステートメントのスコープでコードを実行します。これは非常にまれなケースですが、重大なバグです。

sampcntのデフォルト値 は-3、この条件を何度も実行されます。ほとんどの場合、正しく解決されますが、そうでない場合、事態は急速に悪化します。一体何が起こっているのですか?私は言葉を失います。私はこれまでにこのようなものに遭遇したことはありません。前もって感謝します。

更新(再開を促すため):

struct channel_struct
{
    channel_struct()
    {}
    u32 num;
   u8 vol;
   u8 datashift;
   u8 hold;
   u8 pan;
   u8 waveduty;
   u8 repeat;
   u8 format;
   u8 keyon;
   u8 status;
   u32 addr;
   u16 timer;
   u16 loopstart;
   u32 length;
   u32 totlength;
   double double_totlength_shifted;
   double sampcnt;
   double sampinc;
   // ADPCM specific
   u32 lastsampcnt;
   s16 pcm16b, pcm16b_last;
   s16 loop_pcm16b;
   int index;
   int loop_index;
   u16 x;
   s16 psgnoise_last;
};

これはマルチスレッド アプリケーションです。大規模で複雑なプロジェクトであるため、すべてのコードに精通しているわけではありません。別のスレッドで sampcnt が変更されているのではないかと疑っていますが、バグが発生すると、驚くほどの規則性が示されます。これにより、ある種の原子性の問題から遠ざかることができます。ただし、これはまだ考慮事項です。chan->sampcnt別のスレッドで実行されているコードを変更するコードをまだ特定していませんが、存在する可能性があります。

ただ明確にします。 sampcntは double 型であり、私は確信しています。これは double として宣言され、デバッガーは double としてリストします。また、chan は type へのポインタstruct channel_structです。

4

3 に答える 3

4

時折 chan->sampcnt を上書きしている可能性があるため、失敗したときに実際には -3 にはなりません...これはよくある問題で、特に chan が割り当てられていないメモリを指している場合に顕著です。あなたは本当に十分な情報を提供しておらず、十分なデバッグも行っていません。たとえば、テストを実行する前に chan->sampcnt の値をグローバル変数に保存し、問題が発生したときにその値をチェックして、それが本当に期待どおりかどうかを確認できます。最後にすべきことは、コンパイラまたはハードウェアにバグがあると想定することです...それはほぼ間違いなくプログラムにあります。

于 2012-07-04T02:13:54.623 に答える
1

それを次の形式に書き直すと、コンパイラは問題を指摘するための戦いの機会を得るはずです。

double toTest = chan->sampcnt;
if ( toTest < 8)
{
    *data = 0;
    return;
}
于 2012-07-04T01:51:07.207 に答える
0
int test = (int)chan->sampcnt;
if ( test < 8)
{
   *data = 0;
   return;
}

多分chan->sampcnt符号なしタイプです

于 2012-07-04T02:44:55.667 に答える