C ++ оператор If пропущен - PullRequest
0 голосов
/ 09 мая 2020

Я реализую разрешение столкновений с двумя AABB, но кажется, что компилятор полностью пропускает "if (* yDepth> 0)". Когда я применяю точку останова к оператору в Visual Studio, он отвечает: «Эта точка останова в настоящее время не будет достигнута. Это проблема с указателями? Я пробовал перемещать содержимое оператора, изменяя условия, но, похоже, всегда пропускает if рассматриваемое заявление.

Vector2* normal = new Vector2();
Vector2* vFrom1to2 = new Vector2();
*vFrom1to2 = Vector2(b->getX() - a->getX(), b->getY() - a->getY());
float* xDepth = new float();
*xDepth = (a->getWidth()) + (b->getWidth()) - abs(vFrom1to2->x);
float* yDepth = new float();


if (*xDepth > 0) {

    *yDepth = (a->getHeight()) + (b->getHeight()) - abs(vFrom1to2->y);
    std::cout << "break";
    if (*yDepth > 0) { //this statement is skipped completely. yDepth is greater than 0 on testing.

        if (xDepth < yDepth) {
            if (vFrom1to2->x < 0) {
                normal->x == -1;
                normal->y == 0;
            }
            else {
                normal->x == 1;
                normal->y == 0;
            }

        }
        else {
            if (vFrom1to2->y < 0) {
                normal->x == 0;
                normal->y == -1;
            }
            else {
                normal->x == 0;
                normal->y == 1;
            }

        }

    }


}

1 Ответ

0 голосов
/ 09 мая 2020

В режиме выпуска - или, точнее, когда включена оптимизация - компилятор может переупорядочивать, переупорядочивать, комбинировать или даже удалять строки кода. Это означает, что больше нет взаимно однозначного соответствия между строками кода, которые вы написали, и машинным кодом, который фактически создается. Это может означать, что определенные строки кода больше не могут иметь назначенные им точки останова, и отладчик может пропускать шаги при пошаговом выполнении кода.

Обычно по этой причине лучше выполнять отладку в режиме отладки. Если это невозможно, установите точку останова рядом с интересующей вас строкой и переходите по коду оттуда, а не на ту строку, которая вам интересна.

(Примечание для читателей: спрашивающий пояснил в прокомментируйте, что они испытывают эту проблему в режиме выпуска)

...