不在switch语句中调用的方法

时间:2009-12-06 05:13:08

标签: c++ debugging switch-statement

编辑:现在在调试器中完美运行,但在正常运行时,块根本不会旋转..

我遇到一个问题,我已经通过调试器运行了一段时间,并将其缩小到这个范围。

我屏幕上有一个块,它在中间向下旋转。块的图像明显改变取决于旋转,这是在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语句中出现可怕的错误?

3 个答案:

答案 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)是否也会跳过函数调用。

如果做出这样的改变没有帮助,我会遇到一些事情,这几乎肯定取决于编译器:

  1. 在调试中编译代码而不是在发布模式下编译代码时,未初始化的变量有时归零(当然,我使用的所有Microsoft c ++编译器都会发生这种情况)。这可能会导致不同的行为。它们不需要是指针,它会影响所有变量。

  2. 也许您已经发生了一些异常处理,并且由于异常而没有发生函数调用 - 如果处理异常,执行可能会继续正常,但是如果尝试传递给ApplySurface的任何事情()抛出异常,你可能会发现没有任何用处。

答案 2 :(得分:0)

很多次调试switch语句会导致指令指针看起来像是在一条实际上与程序流无关的行上。

我敢打赌你的m_CurrentRotation与switch语句中的任何内容都不匹配,这就是为什么没有被调用的原因。你可以设置一个监视,或者将一些调试代码添加到默认子句吗?