特征表达调试

时间:2018-12-09 04:47:36

标签: c++ eigen

我正在调试一个使用Eigen库做一些数学运算的函数,并且在不同平台上获得不同的结果。我没有发现任何明显错误的东西,但是我对图书馆并不真正熟悉。我已经将局部变量提取到一个简单的测试应用程序中。在Mac和Windows上,hitRight最终为true,但在Linux上则为true。调试时,我发现将.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 :(得分:1)

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;
}