if ((!m_pMediaPage->PageLayer() || !m_pMediaPage->LoadState()) &&
!m_pMediaPage->m_bRequestList)
{
GetListInfo();
m_pMediaPage->m_bRequestList = TRUE;
}
当所有值都为0时,GetListInfo()不会被执行。
PageLayer()和LoadState()返回整数,m_bRequestList是一个int。
基本上改写为:
if ((!0 || !0) && !0) -or- if ((1 || 1) && 1)
我只能假设if语句评估的值实际上并不是调试器所看到的。
我正在使用visual studio 2005并在第1行和第1行放置断点。 4检查值并查看它是否在if语句中执行。我不知道怎么调试这个。
就像我说的那样,在断点1处,调试器看到的每个值都是0。
.h中的函数:
int PageLayer() {return m_iCurrentLayer;} - protected
BOOL LoadState() {return m_bLoadDone;} - protected
BOOL:
typedef int BOOL;
答案 0 :(得分:2)
如果从不同函数返回的所有值都返回零,则此条件语句看起来好像会被执行。如果没有执行函数体,我会按如下方式调试问题:
在if
- 语句之前记录所有函数的值:
std::cout << "page-layer=" << !m_pMediaPage->PageLayer() << ' '
<< "load-state=" << !m_pMediaPage->LoadState() << ' '
<< "request-list=" << !m_pMediaPage->m_bRequestList << '\n';
是的,调试器也应该显示这些值,但我非常相信打印的值是实际评估的值。
如果没有对错误提供必要的见解,我会开始将条件分解为单独的部分并验证每个级别的成功,例如:
if (!m_pMediaPage->PageLAyer()) {
std::cout << "page-layer is not set\n";\
}
if (!m_pMediaPAge->LoadState()) {
std::cout << "load-state is not set\n";
...
如果这仍然没有提供任何见解,我会开始怀疑函数返回有趣的值,我会验证不同的结果是有趣的值,我会在预处理使用后开始查看输出-E
选项。
答案 1 :(得分:1)
您将问题标记为VS2005;你是否安装了所有相关的服务包,以确保你没有遇到一些长期固定的编译器问题?
其次,您列出的函数似乎是非常简单的setter(您可能希望将它们设为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或堆栈/内存踩踏。
如果这不能解决问题,可能会解决问题。
如果这样可以解决问题,您可能需要查阅程序集以获取代码,看看是否有某种方式导致编译错误。