Передавая Int как void *, затем получая значение - PullRequest
0 голосов
/ 12 декабря 2010

Я использую класс Timer, который принимает void * в качестве необязательного аргумента для передачи обратного вызова.Мне нужно передать целое число, но моя логика, кажется, не работает хорошо.

В Event_PlayerSpawn () у меня есть int * clientIndex, который указывает на расположение памяти int "client".Я передаю это в void * param, а затем в обратном вызове снова приводим его к int *, затем разыменовываем его, чтобы получить значение.Где именно я иду не так?

ResultType PlayerSpawnTimer::OnTimer(ITimer *pTimer, void *pData)
{
    int client = *((int*)pData);
    ConquestPlayer *pPlayer = dynamic_cast<ConquestPlayer*>(CEntity::Instance(client));

    Msg("Spawn Timer Called client = %d!\n", client);
    if(pPlayer)
    {
        pPlayer->FindSpawnLocation();
    }

    return Pl_Continue;
}

void GameManager::Event_PlayerSpawn(IGameEvent *event)
{
    int client = engine->IndexOfEdict(GetEdictOfUserID(event->GetInt("userid")));

    int *clientIndex = &client;
    // Add a 0.1 second delay then handle spawn location
    timerPlayerSpawn = timersys->CreateTimer(&playerSpawnTimerCallback, 5.0, clientIndex, 0);
}

Ответы [ 3 ]

2 голосов
/ 12 декабря 2010

Попробуйте следующее:

timerPlayerSpawn = timersys->CreateTimer(&playerSpawnTimerCallback, 5.0,(void *) client, 0);

А при обратном вызове:

int client = (int)pData;
1 голос
/ 12 декабря 2010

Я не знаю много о реализации timersys-> CreateTimer, но "int client" является локальным для Event_PlayerSpawn и, вероятно, освобождается к моменту вызова PlayerSpawnTimer :: OnTimer.

Если вам действительно нужночтобы передать void * вместо int, вам может понадобиться использовать «new» и «delete», чтобы гарантировать, что память для «int client» будет правильно выделена и освобождена.

0 голосов
/ 12 декабря 2010

Вам необходимо выделить память для переменной. Но пока он в стеке и уничтожается при выходе из Event_PlayerSpawn.

int *clientIndex = new int[1];
clientIndex[0] = client;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...