Пустой символ * успешно конвертируется в действительный неподписанный идентификатор игры int64 ?? КАК?

Я работаю над игрой и столкнулся со странной маленькой проблемой … Мне было интересно, сможет ли кто-нибудь здесь понять это и объяснить мне (это съедает меня!)

Во-первых, вот соответствующий код.

// 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") вернул свое удостоверение личности … кроме как нет.

Отладка:

  • Я закомментировал код, который устанавливает значение 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 и проверяя, пусто это или нет, если оно пустое, тогда я просто обхожу этот код. Но я до сих пор не знаю, в чём проблема. Я теряю сон из-за этого !!!

0

Решение

если c_KickID является пустой строкой с нулевым символом в конце, потоком строк ss будет также пустым, и ss >> kickID не будет иметь никакого эффекта.

поскольку kickID неинициализирован, его значение не указано, а его использование не определено. Одним из возможных результатов является то, что он имеет все случайные биты в этой ячейке памяти в стеке, которые могут быть равны myID,

3

Другие решения

Других решений пока нет …