2012-07-04 69 views
1

代碼如下:(X <8)返回false當x = -3(雙)

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的指針。

+6

我們需要看到的結構類型的定義'chan'了。瞭解一些關於你的程序的更多細節也是有幫助的,比如它是多線程的,周圍的代碼在做什麼等等。我想知道你是否違反了別名規則,並用一個不同的重疊對象訪問對象鍵入... –

+3

具體來說,是什麼類型的sampcnt? –

+0

缺少OP添加更多信息,我傾向於支持投票結束...... –

回答

1

將其重寫爲以下形式應該給編譯器一個戰鬥機會來指出問題。

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

不是真正的問題答案... –

+0

使用調試器時,此表單也更有用,因爲您可以在比較中使用chan-> sampcnt之前輕鬆檢查其值。 – japreiss

+0

編譯器不會指出任何東西,因爲代碼是有效的C. –

4

這有可能是你偶爾覆蓋chan-> sampcnt,所以它是不是真的-3當它失敗...這是一個普遍的問題,特別是如果陳指向malloc內存。你真的沒有提供足夠的信息,也沒有做足夠的調試。舉例來說,你可以在測試之前將chan-> sampcnt的值保存在一個全局變量中,然後在出現問題時檢查該值,看看它是否真的如你所期望的那樣。你應該做的最後一件事情是假設編譯器或硬件存在錯誤......它幾乎肯定在你的程序中。

+1

_你應該做的最後一件事情是假設編譯器或硬件中存在一個錯誤......它幾乎可以肯定在你的程序中._ This。 –

+1

我同意假設不變的值可能被野指針破壞。當我必須追蹤這種bug時,我在gdb中使用了一個觀察點。在比較中設置一個斷點,並在第一次到達時檢查該值。如果該值是正確的(並且從現在開始不應該改變),則在其上設置觀察點並繼續。 –

+0

不要粗魯,但你的評論充滿了假設。我沒有提供足夠的信息,我同意這一點;但是,我一直在做很多你建議的事情(例如,每次發生錯誤時,我都會檢查sampcnt的值)。我不假定它在編譯器或硬件中。我只是困惑,不知道如何繼續下去。我希望在比較中使用雙打有一些特質,這是我之前從未遇到過的。我發現很難相信-3能夠選擇性地通過/失敗條件。 – RGuy8032

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

也許chan->sampcnt是無符號類型

+0

'chan-> sampcnt'是雙重類型。我已經在代碼中和運行時通過調試器驗證了這一點。我已經嘗試了不同類型的浮點投射來嘗試和按摩代碼進行工作。 – RGuy8032

相關問題