Отладка собственного выражения - PullRequest
0 голосов
/ 09 декабря 2018

Я отлаживаю функцию, которая выполняет некоторые математические операции с библиотекой Eigen, и получаю разные результаты на разных платформах.Я не вижу ничего заведомо неправильного, но я действительно не очень знаком с библиотекой.Я вытащил локальные переменные в простое тестовое приложение.hitRight оказывается верным на Mac и Windows, но не на Linux.Во время отладки я выяснил, что размещение .eval () в конце строки «auto rightDistance» решает проблему, но мне бы очень хотелось понять, почему.

#include <stdio.h>

#include "eigen/Eigen/Core"

using namespace Eigen;

int main()
{
    Vector2i p = Vector2i(302,12);
    int mTabControlWidth = 20;
    Vector2i mPos = Vector2i(0,0);
    Vector2i mSize = Vector2i(310,24);

    auto rightDistance = (p - (mPos + Vector2i(mSize.x() - mTabControlWidth, 0))).array();
    bool hitRight = (rightDistance >= 0).all()
    && (rightDistance < Vector2i(mTabControlWidth, mSize.y()).array()).all();
    if (hitRight)
        printf("Hit Right\n");

    printf("Hit none\n");

    return 0;
}

1 Ответ

0 голосов
/ 09 декабря 2018

Vector2i(mSize.x() - mTabControlWidth, 0) разрушается на следующем ;, в то время как rightDistance все еще ссылается на него.Это неопределенное поведение, то есть, если повезет, оно работает так, как вы ожидаете, но оно может делать все, что хочет компилятор (скорее всего, вылетит или вернет произвольные результаты).

Как сказал Avi, просто избегайте auto.В вашем случае вы также должны использовать Array2i вместо Vector2i.Это избавляет вас от написания всех .array().Кроме того, если выражение auto сработало, rightDistance будет оцениваться дважды, а не один раз (ооо, компилятор обычно хорошо это оптимизирует).

int main()
{
    Array2i p(302,12);
    int mTabControlWidth = 20;
    Array2i mPos(0,0);
    Array2i mSize(310,24);

    Array2i rightDistance = (p - (mPos + Array2i(mSize.x() - mTabControlWidth, 0)));
    bool hitRight = (rightDistance >= 0).all() && (rightDistance < Array2i(mTabControlWidth, mSize.y())).all();
    if (hitRight)
        printf("Hit Right\n");

    printf("Hit none\n");

    return 0;
}
...