我正在做一個遊戲,我遇到了一個奇怪的小問題......我想知道這裏是否有人能夠弄清楚並向我解釋它(它正在吞噬我!)空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_KickID
爲
unsigned long long
當
所以......,它被設置爲myID
......這怎麼可能?我完全失去理智!
我已經轉換char *
爲std::string
和檢查,如果這是空的或不是,如果是空的話,我只是繞過這段代碼解決了該問題。但我仍然不知道ACTUALLY是什麼問題。我失去了睡眠!
謝謝!現在我可以輕鬆休息... – Jace