0
if ((!m_pMediaPage->PageLayer() || !m_pMediaPage->LoadState()) &&
     !m_pMediaPage->m_bRequestList)
{
    GetListInfo();
    m_pMediaPage->m_bRequestList = TRUE;
}

当所有值都为 0 时,不会执行 GetListInfo()。

PageLayer() 和 LoadState() 返回整数,而 m_bRequestList 是一个整数。

基本上改写成这样:

if ((!0 || !0) && !0)  -or-  if ((1 || 1) && 1)

我只能假设 if 语句评估的值并不是调试器所看到的那样。

我正在使用 Visual Studio 2005 并在第 1 行和第 4 行放置断点以检查值并查看它是否执行到 if 语句中。我不确定如何调试它。

就像我说的,调试器在断点 1 处查看的 3 个值中的每一个都是 0。

.h 中的函数:

int  PageLayer() {return m_iCurrentLayer;} - protected
BOOL LoadState() {return m_bLoadDone;}     - protected

布尔:

typedef int BOOL;
4

2 回答 2

2

如果从不同函数返回的所有值都返回零,则该条件语句看起来好像会被执行。如果函数的主体没有被执行,我将调试问题如下:

  1. if在-statement之前记录所有函数的值:

    std::cout << "page-layer=" << !m_pMediaPage->PageLayer() << ' '
              << "load-state=" << !m_pMediaPage->LoadState() << ' '
              << "request-list=" << !m_pMediaPage->m_bRequestList << '\n';
    

    是的,调试器也应该显示这些值,但我非常相信打印的值是实际评估的值。

  2. 如果这不能对出现问题提供必要的洞察力,我会开始将条件分解为单独的部分并在每个级别验证成功,例如:

    if (!m_pMediaPage->PageLAyer()) {
        std::cout << "page-layer is not set\n";\
    }
    if (!m_pMediaPAge->LoadState()) {
        std::cout << "load-state is not set\n";
    ...
    
  3. 如果这仍然没有提供任何见解,我会开始怀疑这些函数返回有趣的值,我会验证不同的结果是否是有趣的值,并且我会在使用该-E选项进行预处理后开始查看输出。

于 2013-09-20T20:50:10.740 回答
1

您将问题标记为 VS2005;您是否安装了所有相关的服务包以确保您不会遇到一些长期修复的编译器问题?

其次,您列出的函数似乎是非常简单的设置器(您可能希望将它们设为 const,尽管这与您的问题无关)。

您正在逐步使用调试器,因此检查您的断言是否它们都为零可能很有价值:

bool plCond = (m_pMediaPage->PageLayer());
bool lsCond = (m_pMediaPage->LoadState());
bool rlCond = (m_pMediaPage->m_bRequestList);
bool getListInfoCond = ((!cond1 || !cond2) && !cond3);

if (getListInfoCond)
{
    GetListInfo();
    m_pMediaPage->m_bRequestList = TRUE;
}

如果这解决了问题,那么您要么有一个 heisenbug,要么有一个堆栈/内存踩踏。

如果这不能解决问题,它可能会找到原因。

如果这确实解决了问题,您可能需要查阅程序集以获取代码,看看您是否以某种方式触发了编译器错误。

于 2013-09-21T01:51:49.713 回答