Во время отладки моя программа переходит к ближайшему оператору while без перерыва или продолжения [C ++]

При запуске моей программы C ++ / Qt5 под GDB я испытал то, что кажется невозможным:

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 или другие изменяющие поток заявления в коде. Как это возможно?

Я пытался пересоздать мой код с нуля, чтобы устранить фиктивную связь или подобные проблемы, но ошибка все еще воспроизводима.

Любой вклад приветствуется.

0

Решение

В POINT-B вы находитесь внутри else, который находится внутри if, который находится внутри if. Как только это будет сделано, во всем дереве больше нечего делать.

Где вы ожидаете, что указатель будет прыгать ??

Технически, он будет идти к закрывающей скобке на две строки позади POINT-B, затем к закрывающей скобке на три строки позади POINT-B, а затем к закрывающей скобке на восемь строк позади POINT-B, а затем к закрывающей скобке в самом конце , Все те ничего не делают, поэтому они пропущены.

3

Другие решения

Возьмите бумагу и карандаш и нарисуйте логический поток этого куска кода.

Вы неожиданно обнаружите, что единственным оператором, который может выполняться после оператора, помеченного как «POINT B», является условие в начале цикла while. После выполнения оператора «POINT B» больше нет операторов для выполнения в теле цикла, поэтому выполнение возвращается к while условие для следующей итерации.

1

В основном цикл просто повторяется. Я считаю, что он функционирует так, как и должно быть. Из пункта А управление идет примерно так:

Если № 1 (точка-А) -> Если № 2 -> Остальное, соответствующее Если № 3 -> до конца If № 2 -> до конца If № 1 -> до конца пока цикл.

Когда цикл завершен, выполнение проверяет условие цикла (если оно выполнено), повторяет и в конечном итоге вы снова достигаете точки A.

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

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

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

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

}
}
else
{
}
}
else
{
}
}

Чтобы улучшить отладку и удобочитаемость, не продолжайте вложение, если блоки или циклы — очень трудно отследить выполнение.

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";
}
}
0
По вопросам рекламы [email protected]