我正在制作一个游戏而且我遇到了一个奇怪的小问题...我想知道这里是否有人能够解决这个问题并向我解释(它正在吞噬我!)
首先,这是相关的代码。
// 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多人游戏。这个包含函数是一个回调函数,只要发生了一些值得注意的事情(比如踢一个玩家或开始一个游戏)就会运行。我有两台电脑,我正在测试在线资料(Windows 7机器和Windows XP机器)。
在这种情况下,当两个玩家同时按下“开始游戏”时,会出现一个奇怪的错误可靠。 Windows XP机器播放器将被踢(通过上面的代码) - 这表明GetGameData("kick_member_id")
返回了他的ID ...除非它没有。
调试:
c_KickID
输出到文件中并且它是空的(XP机器没有Visual Studio,因此我无法在其上设置断点,因此我只将其内容输出到文件中)。 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
并检查是否为空,如果它为空,则我只是绕过此代码。但我仍然不知道问题究竟是什么。我正在为此而失眠!!!
答案 0 :(得分:3)
如果c_KickID
是一个空的以空字符结尾的字符串,则字符串流ss
也将为空,ss >> kickID
将不会产生任何影响。
由于kickID
未初始化,因此未指定其值,并且使用它未定义。一种可能的结果是它在堆栈中的那个内存位置有任何随机位,可能等于myID
。