2013-05-28 10 views
0

Я работаю над игрой, и я столкнулся с какой-то странной проблемой ... Мне было интересно, сможет ли кто-нибудь здесь понять это и объяснить это мне (это меня съел!)Пустой символ * успешно конвертируется в действительный неподписанный идентификатор игры 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 vs 1. Эта содержащая функция - это функция обратного вызова, которая запускается всякий раз, когда что-то примечательное (например, ногами игрока или началом игры). У меня есть 2 компьютера, на которых я тестирую онлайн-материал (машина Windows 7 и машина Windows XP).

В этом случае при нажатии на кнопку «Начать игру» появляется точная ошибка . Проигрыватель Windows XP будет пнут (с помощью кода выше), что указывает на то, что GetGameData("kick_member_id") вернул свой идентификатор ... кроме этого нет.

Debugging:

  • Я закомментировал код, который устанавливает «kick_member_id» значение GameData (т.е. пиная Disabled.), Чтобы убедиться - и ошибка продолжает возникать. Хозяин не пинает клиента.
  • Я вывел c_KickID в файл и пуст (на компьютере XP нет Visual Studio, поэтому я не могу установить на нем контрольные точки, поэтому я просто выводил его содержимое в файл).
  • Я попытался объяснить удар игрока XP. Их идентификатор был успешно записан в выходной файл, и их выгнали, как и ожидалось.
  • Я вывел 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 и проверки, если это пустой или нет, если он пуст, то я просто обойти этот код. Но я до сих пор не знаю, в чем проблема НАСТОЯТЕЛЬНО. Я теряю сон над этим !!!

ответ

3

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

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

+0

Спасибо! Теперь я могу спокойно отдохнуть ... – Jace