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是双类型的,我敢肯定。它被声明为双精度,调试器将其列为双精度。此外, 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 回答