2012-07-04 68 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

相关问题