我正在开发一款游戏,但遇到了一个奇怪的小问题......我想知道这里是否有人能够解决这个问题并向我解释(它让我吃不消!)
首先,这是相关代码。
// 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
......这怎么可能?我完全失去理智了!
我已经通过将 a 转换char *
为 astd::string
并检查它是否为空来解决这个问题,如果它是空的,那么我只是绕过这个代码。但我仍然不知道问题到底是什么。我为此失眠了!!!