утверждение else, похоже, игнорируется - PullRequest
9 голосов
/ 28 августа 2010
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 (значение, с которым он инициализируется в ctor PacketRecord).

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) 

Ответы [ 3 ]

19 голосов
/ 28 августа 2010

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

appProtocol == APP_PROTO_RTP;

от

appProtocol = APP_PROTO_RTP;

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

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

5 голосов
/ 28 августа 2010

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

3 голосов
/ 28 августа 2010

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

 appProtocol == APP_PROTO_RTP;

, а не назначение.

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

appProtocol = APP_PROTO_RTP;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...