【发布时间】:2014-01-21 06:24:47
【问题描述】:
我在使用 nvidia 纹理工具 (nvtt) 库时遇到了一个奇怪的问题,我编译该库以构建我自己的纹理转换器。这是问题所在,我得到了一个总是返回 NaN 的函数。就是这样:
class Filter // a class inside (nvtt library)
{
public:
...
float width() const
{
return m_width; // m_width = 3.0 when debug
}
...
private:
float m_width;
};
当我在返回行放置断点时,我看到 m_width 的值为 3.0,但返回的值始终为 NaN:
width = filter.width(); // width = NaN
我在编译设置(代码生成或类似的事情)方面做错了吗?
已编辑:
我发现了问题但无法解决,因为我不太确定这是 NVTT 库或编译器的问题。我不得不挖掘一些汇编知识来确定这个问题。事实证明,函数退出时 FPU(浮点单元)堆栈已满,因此放入 st0 寄存器的返回值变为 NaN。我不知道为什么堆栈变满了,但这可能是编译器的问题,因为我使用的是最新的 Visual C++ Express 2013,并且在使用 VC2012 编译 NVTT 库时没有这个问题。
【问题讨论】:
-
我的建议是添加调试打印语句。我猜调试器正在和你玩游戏。
-
我认为你可能以某种方式破坏了你的堆栈。
-
这不是冒犯,但你确定你真的处决了
width = filter.width();?如果width仍未初始化,则可能是 NaN。 -
你在使用函数指针吗?和演员表?那将是一种相当爆炸性的成分混合物。
-
您提供的代码片段不足以让人们看到可能出现的问题。您必须在赋值处放置一个断点,然后按 F11 进入函数并继续执行,直到找到值被覆盖的位置。