【问题标题】:Visual studio debbuger displays "true" as "0" [closed]Visual Studio 调试器将“true”显示为“0”[关闭]
【发布时间】:2012-11-25 22:50:06
【问题描述】:

我刚刚发生了一个非常奇怪的情况 - 在使用调试器时,它显示某个布尔变量的值是 true,但是当我打印它(或使用它进行任何其他操作)时,它的行为就像0(即假)。

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

到目前为止我:

  • 在我的项目属性中仔细检查编译器没有对代码进行任何优化。
  • 尝试重新打开 Visual Studio 并清理并重新构建项目
  • 在网上搜索解决方案(没有找到)。 我使用的是 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

screen shot

【问题讨论】:

  • 变量初始化了吗?在 Release 中运行它会发生什么?
  • 请发布一个重现问题的小代码示例。
  • 显示您的代码,以及演示问题的屏幕截图。
  • 在发布模式下这个变量确实是真的......我认为该值已初始化但我不是 100% 确定,因为初始化是棘手的部分,我目前正在调试它。就算没有初始化,为什么调试器和c++会有不同的默认值?
  • 即使变量未初始化,它也应该显示相同的值,除非它以不同的方式解释(错误的格式字符串?)或在断点和初始化之间更改。

标签: c++ visual-studio-2010 visual-c++


【解决方案1】:

您不应该使用== 运算符来测试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 也发生了类似的事情,它可能再次测试 1 的值。我不知道为什么 dir 在您的代码中得到一个不寻常的值 (240),但是如果您删除比较并仅测试该值(如上面的 toPush2),它应该可以解决问题。

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

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

【讨论】:

  • 非常有趣的观点。但是请解释一下,为什么getDirection() 的返回值没有转换为布尔类型值(truefalse)?
  • @GeorgeGaál 我使用联合来允许我直接写入这些位。之后它只是复制bool,所以不需要转换。我不得不跳过一些障碍来强制解决这个问题,我不确定它是如何无意中发生的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多