Я работаю над игрой и столкнулся со странной маленькой проблемой … Мне было интересно, сможет ли кто-нибудь здесь понять это и объяснить мне (это съедает меня!)
Во-первых, вот соответствующий код.
// 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")
вернул свое удостоверение личности … кроме как нет.
Отладка:
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
и проверяя, пусто это или нет, если оно пустое, тогда я просто обхожу этот код. Но я до сих пор не знаю, в чём проблема. Я теряю сон из-за этого !!!
если c_KickID
является пустой строкой с нулевым символом в конце, потоком строк ss
будет также пустым, и ss >> kickID
не будет иметь никакого эффекта.
поскольку kickID
неинициализирован, его значение не указано, а его использование не определено. Одним из возможных результатов является то, что он имеет все случайные биты в этой ячейке памяти в стеке, которые могут быть равны myID
,
Других решений пока нет …