编辑:现在在调试器中完美运行,但在正常运行时,块根本不会旋转..
我遇到一个问题,我已经通过调试器运行了一段时间,并将其缩小到这个范围。
我屏幕上有一个块,它在中间向下旋转。块的图像明显改变取决于旋转,这是在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语句中,没有调用FIRST情况的ApplySurface(当我尝试进入它时,没有任何反应)。这会导致块在每次到达该旋转点时变为“空白”。
这是奇怪的事情......
1)如果没有调用ApplySurface函数,那么为什么你可以看到该块首先出现(在它开始旋转之前)?
2)在调试器中运行程序并运行它通常会显示不同的结果。通常,它只是在整个时间内在零度位置显示块。调试器是它实际尝试旋转块的唯一时间。是否正在进行编译器优化,以防止我的switch语句中出现可怕的错误?
答案 0 :(得分:4)
您的代码似乎不必要地冗长且重复。它应该重构:
image = NULL;
switch ( m_CurrentRotation ) {
case BossRotation_ZeroDegrees: {
image = BossFiveImage::p_ZeroDegrees; break;
}
case BossRotation_NinetyDegrees: {
image = BossFiveImage::p_NinetyDegrees; break;
}
case BossRotation_OneEightyDegrees: {
image = BossFiveImage::p_OneEightyDegrees; break;
}
case BossRotation_TwoSeventyDegrees: {
image = BossFiveImage::p_TwoSeventyDegrees; break;
}
default: {}
}
if (image) {
ApplySurface(
m_BossRect.topLeftX,
m_BossRect.topLeftY,
image,
p_Buffer
);
}
这个更简单的代码也应该更容易调试。 m_CurrentRotation的类型和可能值是什么?
答案 1 :(得分:0)
马克·拜尔斯的答案很棒 - 我首先要表达的是风格方面的事情之一:过多的代码重复几乎完全相同。 Mark的回答确实有一个潜在的错误,因为他假设'image'的任何有效值都与NULL不同。由于我不知道BossFiveImage :: p_ZeroDegrees是什么样的,我不知道检查if(image)是否也会跳过函数调用。
如果做出这样的改变没有帮助,我会遇到一些事情,这几乎肯定取决于编译器:
在调试中编译代码而不是在发布模式下编译代码时,未初始化的变量有时归零(当然,我使用的所有Microsoft c ++编译器都会发生这种情况)。这可能会导致不同的行为。它们不需要是指针,它会影响所有变量。
也许您已经发生了一些异常处理,并且由于异常而没有发生函数调用 - 如果处理异常,执行可能会继续正常,但是如果尝试传递给ApplySurface的任何事情()抛出异常,你可能会发现没有任何用处。
答案 2 :(得分:0)
很多次调试switch语句会导致指令指针看起来像是在一条实际上与程序流无关的行上。
我敢打赌你的m_CurrentRotation与switch语句中的任何内容都不匹配,这就是为什么没有被调用的原因。你可以设置一个监视,或者将一些调试代码添加到默认子句吗?