2013-05-28 20 views
0

我正在做一個遊戲,我遇到了一個奇怪的小問題......我想知道這裏是否有人能夠弄清楚並向我解釋它(它正在吞噬我!)空char *成功轉換爲有效的unsigned int64遊戲ID?怎麼樣?

首先,這裏是相關的代碼。

// even if this data is not set, it returns "" 
// so it's pretty much never null 
// but if the function returns something, 
// it will be the string representation of a 64bit unsigned int 
const char* c_KickID = GetGameData("kick_member_id"); 

//gets my ID, works fine. 
unsigned long long myID = GetMyID(); 

if(c_KickID != NULL) 
{ 
    //here i convert it to a unsigned 64-bit int 
    unsigned long long kickID; 
    std::stringstream ss(c_KickID); 
    ss >> kickID; 

    //now I compare the IDs... 
    if (myID == kickID) 
    { 
     //kick player 
    } 
} 

該遊戲是一個1對1的多人遊戲。這個包含函數是一個回調函數,只要有什麼值得注意的事情發生就會運行(例如踢球或開始遊戲)。我有2臺電腦正在測試網上的東西(Windows 7機器和Windows XP機器)。

在這種情況下,當兩個玩家同時按下「開始遊戲」時出現一個奇怪的錯誤可靠。 Windows XP機器播放器將被踢出(通過上面的代碼) - 這暗示GetGameData("kick_member_id")返回了他的ID ...除非它沒有。

調試:

  • 我註釋掉設置GAMEDATA「kick_member_id」值(即殘疾人士踢。),以確保代碼 - 而這個錯誤繼續發生。 主持人沒有踢客戶端。
  • 我輸出c_KickID到一個文件,它是空的(XP機器沒有Visual Studio,所以我不能真正設置它的斷點,所以我只是輸出其內容到一個文件)。
  • 我試圖明確踢XP的球員。如預期的那樣,他們的ID已成功寫入輸出文件並被踢出。
  • 我輸出了kickID到一個文件,它等於myID,這就是爲什麼if (myID == kickID)通過。

要回顧一下:

// This returns an empty char array 
const char* c_KickID = GetGameData("kick_member_id"); 

//get my id... 
unsigned long long myID = GetMyID(); 

//Then I run this. Keeping in mind, c_KickID is empty 
unsigned long long kickID; 
std::stringstream ss(c_KickID); 
ss >> kickID; //<--- now kickID == myID 
轉換空 c_KickIDunsigned long long

所以......,它被設置爲myID ......這怎麼可能?我完全失去理智!

我已經轉換char *std::string和檢查,如果這是空的或不是,如果是空的話,我只是繞過這段代碼解決了該問題。但我仍然不知道ACTUALLY是什麼問題。我失去了睡眠!

回答

3

如果c_KickID是一個空的空終止字符串,該字符串流ss將是空的,以及,ss >> kickID不會有任何影響。

由於kickID未初始化,其值未指定,因此未定義。一種可能的結果是它有任何隨機位在堆棧中的內存位置,可能等於myID

+0

謝謝!現在我可以輕鬆休息... – Jace

相關問題