0

コールバックに渡すオプションの引数として void* を取る Timer クラスを使用しています。整数を渡す必要がありますが、ロジックがうまく機能していないようです。

Event_PlayerSpawn() には、int「クライアント」のメモリ位置を指している int* clientIndex があります。これを void* パラメータに渡し、コールバックで再び 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);
}
4

3 に答える 3

2

次のことを試してください。

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

そしてコールバックで:

int client = (int)pData;
于 2010-12-12T15:28:04.167 に答える
1

timersys->CreateTimer の実装についてはよくわかりませんが、「int クライアント」は Event_PlayerSpawn に対してローカルであり、おそらく PlayerSpawnTimer::OnTimer が呼び出されるまでに割り当てが解除されます。

int の代わりに void * を渡す必要がある場合は、「int client」のメモリが適切に割り当てられ、割り当てが解除されるように、「new」と「delete」を使用する必要がある場合があります。

于 2010-12-12T15:36:42.650 に答える
-1

変数にメモリを割り当てる必要があります。しかし、今のところ、それはスタックにあり、あなたが離れると破壊されますEvent_PlayerSpawn.

int *clientIndex = new int[1];
clientIndex[0] = client;
于 2010-12-12T15:35:50.573 に答える