gpt4 book ai didi

c++ - 为什么 glm::mat3 和 glm::value_ptr 在时间和宇宙中创造了一个黑洞,并破坏了我脑海中任何可能的逻辑?

转载 作者:搜寻专家 更新时间:2023-10-31 01:25:56 25 4
gpt4 key购买 nike

我正在使用著名的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com