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。另外,chan是指向struct channel_struct
的指針。
我們需要看到的結構類型的定義'chan'了。瞭解一些關於你的程序的更多細節也是有幫助的,比如它是多線程的,周圍的代碼在做什麼等等。我想知道你是否違反了別名規則,並用一個不同的重疊對象訪問對象鍵入... –
具體來說,是什麼類型的sampcnt? –
缺少OP添加更多信息,我傾向於支持投票結束...... –