c++ - 特征表达式调试
问题描述
我正在调试一个用 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)
在 next 被破坏;
,同时rightDistance
仍然引用它。那是未定义的行为,也就是说,运气好的话,它可以像您期望的那样工作,但它可能会做编译器想做的任何事情(很可能会崩溃或返回任意结果)。
正如 Avi 所说,只要避免auto
. 在您的情况下,您还应该使用Array2i
而不是Vector2i
. 这使您免于编写所有.array()
. 此外,如果auto
表达式有效,rightDistance
将被评估两次而不是一次(otoh,编译器通常擅长优化它)。
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;
}
推荐阅读
- java - 从主题读取后异步提交一条消息
- sql - 如何在多个数据库中执行单个sql查询
- python-3.x - 如何在熊猫中转换百万美元的列?
- rdf - 使用 RDF,请求有关如何对一个集合的 ORed(所有)成员和一个与集合的 ANDed(所有)成员进行建模的建议
- javascript - 如何在javascript中导入或使用第三方命名空间中定义的函数?
- mysql - MySQL - ORDER BY Rand() 总是给出相同的结果
- mysql - 为什么MySQL不能更新表并在子查询中从同一个表中选择
- angular - 当所有模块都已经被延迟加载时,如何进一步减少 Angular 7 的构建大小?
- android - 改造返回 null
- python - Django反序列化为模型实例而不保存到数据库