我正在使用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);
}
答案 0 :(得分:2)
尝试以下方法:
timerPlayerSpawn = timersys->CreateTimer(&playerSpawnTimerCallback, 5.0,(void *) client, 0);
在回调中:
int client = (int)pData;
答案 1 :(得分:1)
我对timersys-&gt; CreateTimer实现了解不多,但“int client”是Event_PlayerSpawn的本地,并且可能在调用PlayerSpawnTimer :: OnTimer时释放。
如果确实需要传递void *而不是int,则可能需要使用“new”和“delete”来确保“int client”的内存被正确分配和释放。
答案 2 :(得分:-1)
您需要为变量分配内存。但是现在,当你离开Event_PlayerSpawn
时它会被堆叠并被摧毁。
int *clientIndex = new int[1];
clientIndex[0] = client;