- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用著名的 OpenGL 框架创建一个漂亮的图形引擎,但突然遇到了一个意想不到的问题(就像所有问题一样)。
我必须创建一个函数来修改 glm::mat3 中的特定值。为此,我创建了一个简单的函数,该函数返回对 glm::mat3 中特定 float 的简单引用,但似乎没有任何效果,我不知道是什么原因。
这是我的功能:
float& mat3ValueAt(glm::mat3& m, int l, int c) {
// l is the line index and c is the column index...
return glm::value_ptr(m)[3 * l + c];
}
要查看它是否有效,我必须使用能够显示矩阵的函数:
std::ostream& operator<<(std::ostream& stream, glm::mat3 m) {
for (int i = 0; i < 9; i++) {
stream << GLS::mat3ValueAt(m, i / 3, i % 3) << ((i + 1) % 3 ? ' ' : '\n');
}
return stream;
}
所有这些都不起作用……但没关系……这一定是我的错……所以我将看起来不错的无效代码减少到我能在其中发现异常的最小代码。 ..
这就是我最终完全生气并让我发疯的原因:
int main() {
glm::mat3 m;
std::cout << "display uninitialised value..." << std::endl;
std::cout << *(glm::value_ptr(m) + 5) << std::endl; // should display an uninitialised value
*(glm::value_ptr(m) + 5) = 42;
std::cout << "display the initialised value" << std::endl;
std::cout << *(glm::value_ptr(m) + 5) << std::endl; // should display 42
}
这段小代码的结果是...
display uninitialised value...
42
display the initialised value
42
所以我之前的两个函数不起作用这一事实是可以的,也许我只是不知道 value_ptr 是如何工作的……但我很确定一件事……在分配给它之前,一个值不能有我们要分配给它的值!
而且我输入的值而不是 42 并不重要,它总是在我赋值之前赋值!
这怎么可能?
最佳答案
这个:
glm::mat3 m;
创建一个未初始化的对象;此对象的内容具有不确定的值。任何尝试读取具有不确定值的对象的值都会导致未定义的行为。
因此,编译器可以自由地将您的代码重新排序为如下所示:
int main() {
glm::mat3 m;
*(glm::value_ptr(m) + 5) = 42;
std::cout << "display uninitialised value..." << std::endl;
std::cout << *(glm::value_ptr(m) + 5) << std::endl; // should display an uninitialised value
std::cout << "display the initialised value" << std::endl;
std::cout << *(glm::value_ptr(m) + 5) << std::endl; // should display 42
}
这是完全有效的,因为如果你试图在初始化它之前从值中读取它,你就处于未定义的行为领域,并且已经初始化该值并不比任何其他未定义的行为更正确。
关于c++ - 为什么 glm::mat3 和 glm::value_ptr 在时间和宇宙中创造了一个黑洞,并破坏了我脑海中任何可能的逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56064899/
我在让安全组件验证已发布的表单时遇到问题,并且它一直阻止该操作。查看代码,我发现散列标记不匹配。 在发布的表单中,只有一个字段(在 Security::_validatePost 中)被验证为被锁定。
我在让安全组件验证已发布的表单时遇到问题,并且它一直在黑洞操作。查看代码,我发现哈希标记不匹配。 在发布的表单中,只有一个字段被验证(在 Security::_validatePost 中)被锁定。但
基本上,我试图在控制台中输入一个值,并将小数点作为一个整数输出,这就是本质上需要发生的事情。 我开发了一种方法来执行此操作,使用 float 、整数和简单的数学运算。我还是 C++ 的新手,但这个错误
我刚刚将 SSL 添加到运行 Cake 2.3.8 应用程序的 Ubuntu 12.04 apache2 服务器。我确保在每次通话前添加 https://... 并使用 grep 确认。据我所知,没有
我是一名优秀的程序员,十分优秀!