2010-08-28 16 views
9
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; 
    } 
} 

deyimi true değerlendirmek başarısız olursa iç olursa göz ardı edilir, başka blok yürütülecek beklenir (appProtocol APP_PROTO_RTP ayarlı). Ancak, bu gerçekleşmez. Bunun yerine, başka bir ifadenin tamamen yok sayılmış gibi görünüyor. Neden böyle olduğunu anlayamıyorum.else ifadesi görünüşte

Gdb oturumumdan da görebileceğiniz gibi, if ifadesinin ilk kez çalışması ve appProtocol uygulaması APP_PROTO_SIP olarak ayarlandı (beklendiği gibi). ikinci kez, başarısız olursa, ancak başka birine girip APPProject'ine appProtocol değerini ayarlamak yerine, appProtocol'u ayarlamadan fonksiyondan tamamen çıkar. appProtocol APP_PROTO_INVALID olarak ayarlanmış (PacketRecord ctor'da başlatılan değer).

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

derleyici uyarıları açılması bir Sözdiziminizin hatası için uyarı "ifadesi herhangi bir etkisi yoktur" düzenlemelidir. Değilse, daha iyi bir derleyici edinin. Ubuntu avatarından yola çıkarak, 'g ++ -Wall' ne yapmanız gerektiği ** her zaman ** kullanın. – msw

+1

@msw: Gerçekten. Açıkçası, asıl kod, (el ile kopyalanmalıdır), bu kopyayı gizleyebildiğinden (çünkü, zobdos bilinçsiz olarak '=' değil, '==' yazmış olduğundan), soruya (gerektiği gibi) _pasted_dı. Her zaman neden kodun _paste_ gerektiğini bir (pozitif) ders kitabı örneği. – sbi

cevap

19

Sen

appProtocol = APP_PROTO_RTP; 

(ikili eşit işareti)

else deyimi ile

appProtocol == APP_PROTO_RTP; 

değiştirmelisiniz yürütülür. Ancak, değeri appProtocol’a atamadınız.

+1

+1 Bu ifade, kesinlikle kapsama alanıyla birlikte koddan tamamen optimize edilecektir. –

+0

Sağ. Ve böyle problemler için bir hata ayıklayıcısı yerine baskı kullanmalıyız. Basit bir "cout << appProtocol << endl;" sorununu gösterebilirdi. – AndiDog

+8

İyi bir derleyici, bunun gibi hatalar hakkında da uyarıda bulunabilir ("ifadenin bir etkisi yoktur"). Uyarıları (ve yüksek) açmaya yardımcı olur. – UncleBens

5

Atama yapmıyorsunuz, karşılaştırıyorsunuz. Burada bir eşitlik deyimi kullanıyorsanız = değil ==

3

kullanın:

appProtocol == APP_PROTO_RTP; 

ziyade bir yönetici atamalarında daha.

doğru kod şudur:

appProtocol = APP_PROTO_RTP;