else оператор по-видимому игнорируется

void PacketRecord::determineAppProtocol()
{
    if (ipProtocol == IP_PROTO_UDP)
    {
        std::istringstream ss(udpData);

        std::string line;
        if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos))
        {
            appProtocol = APP_PROTO_SIP;
        }
        else
        {
            appProtocol == APP_PROTO_RTP;
        }
    }
    else
    {
        appProtocol = APP_PROTO_UNKNOWN;
    }
}

) Если внутреннему оператору if не удается вычислить значение true, я ожидаю, что будет выполнен блок else (appProtocol имеет значение APP_PROTO_RTP). Однако это не вместо этого, кажется, что оператор else полностью игнорируется. Я не могу понять, почему это так.

Как вы можете видеть из моего сеанса gdb, первый раз, когда оператор if работает и appProtocol устанавливается в APP_PROTO_SIP ( как и ожидалось). во второй раз происходит сбой if, но вместо перехода в else и установки appProtocol в APP_PROTO_RTP он полностью выходит из функции без установки appProtocol. appProtocol остается установленным в APP_PROTO_INVALID (значение, которое инициализируется в PacketRecord ctor).

Breakpoint 1, PacketRecord::determineAppProtocol (this=0x805c6c8) at PacketRecord.cpp:156
156     if (ipProtocol == IP_PROTO_UDP)
(gdb) step
158         std::istringstream ss(udpData);
(gdb) 
159         std::string line;
(gdb) 
160         if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos))
(gdb) 
162             appProtocol = APP_PROTO_SIP;
(gdb) 
167         }
(gdb) 
173 }
(gdb) continue 
Continuing.

Breakpoint 1, PacketRecord::determineAppProtocol (this=0x8065388) at PacketRecord.cpp:156
156     if (ipProtocol == IP_PROTO_UDP)
(gdb) step
158         std::istringstream ss(udpData);
(gdb) 
159         std::string line;
(gdb) 
160         if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos))
(gdb) 
167         }
(gdb) 
173 }
(gdb) 
9
задан shamittomar 28 August 2010 в 15:31
поделиться

3 ответа

Вы должны заменить

appProtocol == APP_PROTO_RTP;

на

appProtocol = APP_PROTO_RTP;

(без двойного знака равенства)

Выполняется оператор else. Но вы не присваиваете в нем значение appProtocol.

19
ответ дан 4 December 2019 в 08:00
поделиться

Вы не присваиваете, вы сравниваете. Используйте =, а не ==

5
ответ дан 4 December 2019 в 08:00
поделиться

Здесь вы используете оператор равенства:

 appProtocol == APP_PROTO_RTP;

а не присваивание.

Правильный код:

appProtocol = APP_PROTO_RTP;
3
ответ дан 4 December 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: