4

一个非常奇怪的案例刚刚发生在我身上——在使用调试器时,它向我显示某个布尔变量的值为true,但是当我打印它(或对其进行任何其他操作)时,它的行为为0(即 false)。

我能做些什么来修复这个错误?恐怕这是环境错误,因此发布代码示例将毫无意义。(一个隐藏的、烦人的内存管理错误不可能是原因,对吧?),在这种情况下,我想指出,我会惊讶地发现我的环境没有配置好(我在这个项目上工作环境一年多)。

到目前为止我:

  • 仔细检查编译器在我的项目属性中没有对代码进行任何优化。
  • 试图重新打开视觉工作室并清理并重新构建项目
  • 在网上搜索解决方案(没有找到任何解决方案)。我使用 Visual Studio 2010,我的编程语言是 C++

关于代码共享请求:

很抱歉,我无法发布代码(我的老板不会很高兴看到它在网络上运行)......如果你能就问题的可能原因给出一些想法,那就太好了,我会自己在代码中寻找线索,检查这些原因是否真的导致了问题。然而,为了清楚起见,这里有几行代码让我很苦恼:

    bool dir = getNode(location)->getNext()->getDirection(); //dir is displayed as "true" in the debbuger
    int toPush = (dir == 1) ? 1 : 0; //"toPush" is displayed as "0" in the debbugger
    cout<<dir<<endl; //both output 0.
    cout<<(dir == true)<<endl;

根据您的要求,我附上屏幕截图。注意屏幕右下角的“dir”值是“true”,右边的程序输出以 0 结尾(对应于“cout<< dir”命令)。

截屏

4

1 回答 1

3

您不应该使用==运算符来测试bool值的真实性。任何非零值都为真。你有两cout行,控制台窗口中的最后两行说 240 和 0。我写这个是为了演示我认为正在发生的事情:

#include <iostream>

using namespace std;

static bool getDirection()
{
    union forceBoolValue
    {
        unsigned int iValue;
        bool bValue;
    };
    forceBoolValue retValue;
    retValue.iValue = 0xFFFFFFFF;
    return retValue.bValue;
}

int _tmain(int argc, _TCHAR* argv[])
{
    bool dir = getDirection();  //dir is now 255*, which is non-zero and therefore "true"
    int toPush = (dir == 1) ? 1 : 0;  //dir may be true but it is not one, so toPush is 0
    int toPush2 = dir ? 1 : 0;  //dir is true, so toPush2 is 1
    cout << "Dir: " << dir << endl;
    cout << "toPush: " << toPush << endl;
    cout << "toPush2: " << toPush2 << endl;
    return 0;
}

类似的事情发生dir == true在它可能再次测试 one 的值的地方。我不知道为什么dir在你的代码中得到一个不寻常的值(240),但如果你删除比较并只测试值(toPush2如上)它应该可以解决问题。

我知道您说该toPush行只是为了演示问题,但是您是否在任何真实代码中进行比较?如果是这样,请删除它们。

*dir可能不是 255,取决于bool您环境中的大小。

于 2012-11-26T00:08:07.217 回答