我正在调试一个使用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 回答
Vector2i(mSize.x() - mTabControlWidth, 0)
在下一个;
被破坏,而rightDistance
仍然引用它 . 这是未定义的行为,即运气好像你期望的那样,但它可能会做任何编译器想要做的事情(很可能崩溃或返回任意结果) .正如阿维所说,只是避免
auto
. 在您的情况下,您还应该使用Array2i
而不是Vector2i
. 这样可以避免编写所有.array()
. 此外,如果auto
表达式有效,rightDistance
将被评估两次而不是一次(o.t.o.h,编译器通常很擅长优化它) .