【发布时间】:2009-12-06 05:13:07
【问题描述】:
编辑:现在可以在调试器中完美运行,但正常运行时块根本不旋转..
我遇到了一个问题,我已经在调试器中运行了很多次并将其缩小到这个范围。
我的屏幕上有一块从中间落下并旋转的方块。块的图像明显变化取决于旋转,这是在 switch 语句中完成的。
switch ( m_CurrentRotation ) {
case BossRotation_ZeroDegrees: {
ApplySurface(
m_BossRect.topLeftX,
m_BossRect.topLeftY,
BossFiveImage::p_ZeroDegrees,
p_Buffer
);
break;
}
case BossRotation_NinetyDegrees: {
ApplySurface(
m_BossRect.topLeftX,
m_BossRect.topLeftY,
BossFiveImage::p_NinetyDegrees,
p_Buffer
);
break;
}
case BossRotation_OneEightyDegrees: {
ApplySurface(
m_BossRect.topLeftX,
m_BossRect.topLeftY,
BossFiveImage::p_OneEightyDegrees,
p_Buffer
);
break;
}
case BossRotation_TwoSeventyDegrees: {
ApplySurface(
m_BossRect.topLeftX,
m_BossRect.topLeftY,
BossFiveImage::p_TwoSeventyDegrees,
p_Buffer
);
break;
}
default: {}
}
方块以零度进入,一旦进入中间,它就会开始旋转。我从调试中发现,在 switch 语句中,第一种情况的 ApplySurface 没有被调用(当我尝试进入它时,没有任何反应)。这会导致块在每次到达该旋转点时变为“空白”。
这里有一些奇怪的东西......
1) 如果 ApplySurface 函数没有被调用,那么为什么你会看到块开始下降(在它开始旋转之前)?
2) 在调试器中运行程序和正常运行会显示不同的结果。通常,它只是始终将块显示在其零度位置。调试器是它实际尝试旋转块的唯一时间。是否正在进行编译器优化以防止我的 switch 语句中出现可怕的错误?
【问题讨论】:
-
-
当你附加一个调试器时,你改变了程序。至少,你改变了程序的时间。您应该查看线程和共享资源,以确保您没有遇到时间问题。此外,如果您在 switch 语句之前不提供代码,则很难调试正在发生的事情。如果没有附加代码,问题就变成了,“为什么我的代码没有进入 switch 语句的第一个 case?”答案就变成了“因为条件永远不会匹配那种情况。”
-
@atk 它确实输入了第一个 case 语句。它只是不调用该函数。 @米奇小麦谢谢。我会调查的。
-
Mitch 的评论让我想到了未初始化的指针。我去了我加载图像的地方,并注意到当我检查 null 时,我使用了 = 而不是 ==。我以前犯过这个错误,我认为是时候获得像 lint 这样的工具了。它现在在调试模式下完美运行,但在正常运行时仍然不旋转。
-
@person:这就是为什么应该使用 NULL==P 而不是 p==NULL
标签: c++ debugging switch-statement