0

在 gdb 下运行我的 C++/Qt5 程序时,我经历了似乎不可能的事情:

while(totalAvailable > (sizeof(quint32)+sizeof(quint16))){  
    if(nullptr!=c){
        // POINT-A
        qDebug()<<rct<<"Courier message with ID "<<octomy_message_type_int<<" was received with name "<<c->getName()<<" and "<<bytesAvailable<<" bytes available";
        const quint16 bytesSpent=c->dataReceived(*ds, bytesAvailable);
        const int left=bytesAvailable-bytesSpent;
        totalAvailable-=bytesSpent;
        if(left>=0){
            if(left>0){
                ds->skipRawData(left);
                totalAvailable-=left;
            }
            else{
                // POINT-B
                qDebug()<<rct<<"LOLBOB";
            }
        }
        else{
            qWarning()<<"BAR";
            return;
        }
    }
    else{
        qWarning()<<"FOO";
        return;
    }
}

简而言之,当我从一切开始时//POINT-A//POINT-B一切都如预期的那样,但是一旦我越过//POINT-B调试器就会跳到程序的第一行(while语句)。但是代码中没有break或没有continue其他改变流程的语句。这怎么可能?

我尝试从头开始重建我的代码以消除虚假链接或类似问题,但该错误仍然可以重现。

欢迎任何意见。

4

4 回答 4

2

在 POINT-B,你在一个 else 里面,它在一个 if 里面,它在一个 if 里面。一旦这个 else 完成,整个树就没有更多的事情要做了。

您希望指针跳转到哪里?

从技术上讲,它会到 POINT-B 后面两行的右括号,然后到 POINT-B 后面三行的右括号,然后到 POINT-B 后面八行的右括号,然后到最后的右括号. 所有这些都什么都不做,所以它们被跳过了。

于 2016-07-02T01:47:54.030 回答
1

拿一张纸和铅笔,画出这段代码的逻辑流程。

您会惊奇地发现,在您标记为“POINT B”的语句之后,唯一可能执行的语句是 while 循环开始时的条件。执行完“POINT B”语句后,循环体中没有更多语句可以执行,因此执行回到while条件,进行下一次迭代。

于 2016-07-02T01:48:34.850 回答
0

基本上循环只是重新迭代。我相信它正在发挥应有的作用。从 Point-A 开始,控制是这样的:

If no.1 (Point-A) -> If no.2 -> Else 对应 If no.3 -> back to end of If no.2 -> back to end of If no.1 -> back to end of while 循环。

当循环结束时,执行检查循环的条件,(如果满足)重新迭代,最终再次到达 A 点。

while()
{
    if() // If no.1
    {

    // Point-A *****************************

        if() // If no.2
        {
            if() // If no.3
            {
            }
            else()
            {

                // Point-B *****************

            }
        }
        else
        {
        }
    }
    else
    {
    }
}

为了提高调试和可读性,不要继续嵌套 if 块或循环 - 跟踪执行非常困难。

于 2016-07-02T01:57:42.590 回答
0

看看你是否这样写:

while(totalAvailable > (sizeof(quint32)+sizeof(quint16))){  

    if(nullptr==c){
    qWarning()<<"FOO";
        return;
    }

    // POINT-A
    qDebug()<<rct<<"Courier message with ID "<<octomy_message_type_int<<" was received with name "<<c->getName()<<" and "<<bytesAvailable<<" bytes available";
    const quint16 bytesSpent=c->dataReceived(*ds, bytesAvailable);
    const int left=bytesAvailable-bytesSpent;
    totalAvailable-=bytesSpent;
    if(left<0){
        qWarning()<<"BAR";
        return;    
    }

    if(left>0){
        ds->skipRawData(left);
        totalAvailable-=left;
    }
    else{
        // POINT-B
        qDebug()<<rct<<"LOLBOB";
    }    
}
于 2016-07-02T02:04:32.713 回答