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