2010-08-28 8 views
9

Wenn die innere if-Anweisung nicht als wahr ausgewertet wird, würde ich erwarten, dass der Else-Block ausgeführt wird (appProtocol auf APP_PROTO_RTP gesetzt). Dies geschieht jedoch nicht. Stattdessen scheint die else-Anweisung vollständig ignoriert zu werden. Ich kann mir nicht vorstellen, warum das so ist.else-Anweisung wird scheinbar ignoriert

Wie Sie in meiner gdb-Sitzung sehen können, funktioniert die if-Anweisung zum ersten Mal, und appProtocol wird (wie erwartet) auf APP_PROTO_SIP gesetzt. Beim zweiten Mal schlägt das if fehl, aber anstatt in die else zu gehen und appProtocol auf APP_PROTO_RTP zu setzen, wird die Funktion vollständig zurückgesetzt, ohne dass appProtocol gesetzt wird. appProtocol bleibt auf APP_PROTO_INVALID gesetzt (der Wert, mit dem es im PacketRecord ctor initialisiert wird).

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) 
+4

auf Compiler-Warnungen Drehen sollte eine „Über Anweisung hat keine Auswirkung“ für Ihre Syntaxfehler zu warnen. Wenn nicht, besorge dir einen besseren Compiler. Von deinem Ubuntu-Avatar zu urteilen, ist "g ++ -Wall" das, was du ** immer ** benutzen solltest. – msw

+1

@ mw: In der Tat. Offensichtlich wurde der ursprüngliche Code _pasted_ in die Frage eingefügt (wie es sollte), da das manuelle Kopieren diesen Fehler versteckt hätte (weil zobdos unbewusst "=', nicht '==') eingegeben hätte. Ein (positives) Lehrbuchbeispiel, warum Sie den Code immer _paste_ sollten. – sbi

Antwort

19

Sie ersetzen sollte, ist

appProtocol == APP_PROTO_RTP; 

von

appProtocol = APP_PROTO_RTP; 

(keine doppelte Gleichheitszeichen)

Die else-Anweisung ausgeführt. Aber Sie geben den Wert für appProtocol nicht darin ein.

+1

+1 Diese Aussage wird sicherlich außerhalb des Codes zusammen mit dem umfassenden Zweig insgesamt optimiert. –

+0

Rechts. Und für solche Probleme sollte man statt eines Debuggers Ausdrucke verwenden. Ein einfaches 'cout << appProtocol << endl;' hätte das Problem gezeigt. – AndiDog

+8

Ein guter Compiler kann auch vor solchen Fehlern warnen ("Anweisung hat keine Wirkung"). Es hilft Warnungen zu aktivieren (und hoch). – UncleBens

5

Sie ordnen nicht zu, Sie vergleichen. Verwenden Sie =, nicht ==

3

Sie verwenden eine Gleichheit Aussage hier:

appProtocol == APP_PROTO_RTP; 

eher als ein Stelldichein.

Der richtige Code ist:

appProtocol = APP_PROTO_RTP;