2010-12-12 3 views
0

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

Event_PlayerSpawn()には、int "client"のメモリ位置を指すint * clientIndexがあります。私はこれを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

もっと具体的に教えてください。コンパイルエラーがありますか?エラーメッセージは何ですか、どのラインにありますか?それとも、ランタイムエラーですか? – Haspemulator

+0

ランタイムエラーです。コールバックでは0として出力されますが、渡されたときは異なります(実行時に変更されますが、1〜33の間で変更されます)。 –

答えて

-1

あなたは変数にメモリを割り当てる必要があります。しかし、今のところそれはスタックしており、あなたが離れるときに破壊されます。Event_PlayerSpawn私はtimersys->のcreateTimerの実装について多くを知っているが、「int型クライアント」はありません

int *clientIndex = new int[1]; 
clientIndex[0] = client; 
+0

このために配列を作成する必要はありません。 'new int(client)'はうまくいきました。 – jtdubs

2

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

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

とコールバックで:

int client = (int)pData; 
1

はEvent_PlayerSpawnにローカルであり、おそらくPlayerSpawnTimer ::のOnTimerが呼び出された時点で割り当てが解除されます。

intの代わりにvoid *を渡す必要がある場合は、「int」クライアントのメモリが確実に割り当てられ、割り当てが解除されるように、「new」と「delete」を使用する必要があります。

関連する問題