Метод не вызывается в операторе switch - PullRequest
0 голосов
/ 06 декабря 2009

Редактировать: теперь отлично работает в отладчике, но блок не вращается вообще при нормальной работе.

У меня проблема с тем, что я пробежал тонну отладчика и сузил ее до этого.

У меня есть блок на экране, который спускается посередине и вращается. Изображение блока, очевидно, меняется, зависит от поворота, и это делается в операторе 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 для случая FIRST (когда я пытаюсь войти в него, ничего не происходит). Это приводит к тому, что блок становится пустым каждый раз, когда он достигает этой точки вращения.

Вот странные вещи ...

1) Если функция ApplySurface не вызывается, то почему вы видите, как сначала блок падает (до того, как он начинает вращаться)?

2) Запуск программы в отладчике и его запуск обычно показывают разные результаты. Обычно он просто показывает блок в его нулевой позиции все время. Отладчик - единственный раз, когда он фактически пытается повернуть блок. Происходят ли оптимизации компилятора, которые препятствуют тому, чтобы что-то происходило ужасно неправильно в моем операторе switch?

Ответы [ 3 ]

4 голосов
/ 06 декабря 2009

Ваш код кажется излишне длинным и повторяющимся. Должен быть рефакторинг:

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?

0 голосов
/ 06 декабря 2009

Много раз отладка операторов switch приводит к тому, что указатель инструкции выглядит как строка, которая на самом деле не имеет отношения к потоку программы.

Держу пари, у вас есть m_CurrentRotation, которая не соответствует никому в выражении switch, и поэтому ничего не вызывается. Можете ли вы на это посмотреть или добавить отладочный код в предложение по умолчанию?

0 голосов
/ 06 декабря 2009

Ответ Марк Байерса великолепен - одна из первых вещей, которые я бы назвал по стилю: слишком много повторений кода, которые почти идентичны. Ответ Марка имеет одну потенциальную ошибку в том, что он предполагает, что любое из допустимых значений для «изображения» не совпадает с NULL. Поскольку я не знаю, что это за BossFiveImage :: p_ZeroDegrees, я не знаю, пропустит ли проверка (image) также вызов функции.

Если внесение этого изменения не поможет, я столкнулся с несколькими вещами, которые почти наверняка будут зависеть от компилятора:

  1. неинициализированные переменные иногда обнуляются, когда код компилируется в отладочной, но не в режиме выпуска (конечно, происходит со всеми компиляторами Microsoft c ++, которые я использовал). Это может вызвать другое поведение. Они не должны быть указателями, это влияет на все переменные.

  2. Возможно, у вас происходит какая-то обработка исключений, и вызов функции не происходит из-за исключения - выполнение может продолжаться нормально, если обработано исключение, но если что-то из этого вы попытаетесь передать в ApplySurface () сгенерируйте исключение, которое может оказаться бесполезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...