2012-05-04 21 views
2

我的代碼有問題。當我運行代碼時,短「操作碼」的錯誤的值爲52496.所以我一步一步地調試代碼......並且當我這樣做時,「操作碼」的值爲正確值4624!有人可以給我一個提示嗎?運行給出錯誤的數字,但調試工作正常嗎?

void packet_get() 
{ 
    boost::shared_ptr<boost::array<unsigned char, 2>> opc(new boost::array<unsigned char, 2>); 
    recv_two_bytes(opc); 
    unsigned short opcode; 

    unsigned char * test[2]; 
    test[0] = &opc->at(0); // *test[0] == 0x12 
    test[1] = &opc->at(1); // *test[1] == 0x10 

    opcode = 0; 
    int i = 0; 
    for(i = 0; i <= 1; i++) 
    { 
     opcode = (opcode<<8) | *(test[i]); 
    } 
    // opcode should now be short 4624 
} 
+0

你有'* test [0]'和'* test [1]'的正確值嗎? 'recv_two_bytes'可能有一個未初始化的變量,在調試時運氣設置爲零,但在正常運行時設置爲隨機值。另外,在編譯器中啓用所有警告,它可能會告訴你你的問題。 – Shahbaz

+0

經過一番嘗試...我認爲你是對的!非常感謝你! –

+0

我會將此作爲答案發布,以便您可以接受。 – Shahbaz

回答

2

通常,當正常程序和調試程序之間的程序行爲不同時,這是由於未定義的行爲。一個這樣的常見錯誤是未初始化的變量。

當你執行一個程序時,它會得到一個很可能未初始化的堆棧。在調試模式下,調試器可以初始化這個堆棧。因此,未初始化的變量在調試和正常執行時可以很容易地具有不同的值(即使在調試模式下也是0),大多數情況下實際上是想給該變量但忘記了)。

看起來好像你在recv_two_bytes函數中有類似的錯誤。在編譯器上啓用所有警告將有助於在問題更加簡單的情況下查明問題。

請注意其他錯誤,如索引出陣列也。

相關問題