2010-12-12 11 views
0

Ich benutze eine Timer-Klasse, die eine void * als optionales Argument nimmt, um an den Rückruf zu übergeben. Ich muss eine ganze Zahl übergeben, aber meine Logik scheint nicht gut zu funktionieren.Passing Int als void * dann bekomme ich den Wert

In Event_PlayerSpawn() Ich habe eine int * clientIndex, die auf den Speicherort des int "Client" verweist. Ich übergebe das in den void * -Param und werfe es dann im Callback auf ein int * zurück, um es dann zu dereferenzieren, um den Wert zu erhalten. Wo genau gehe ich falsch?

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

Könnten Sie bitte genauer sein? Haben Sie einen Übersetzungsfehler? Also, was ist der Fehler Fehlermeldung ist und auf welcher Linie haben Sie es? Oder es ist Laufzeitfehler? – Haspemulator

+0

Laufzeitfehler, es kommt als 0 im Callback heraus, aber wenn es übergeben wird, ist es anders (ändert sich zur Laufzeit, aber zwischen 1-33). –

Antwort

-1

Sie müssen Speicher für Variable zuzuweisen. Aber jetzt ist es im Stapel und zerstört, wenn Sie Event_PlayerSpawn verlassen.

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

Keine Notwendigkeit, ein Array dafür zu erstellen: 'New Int (Client)' hätte gut funktioniert. – jtdubs

2

Versuchen Sie Folgendes:

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

Und in der Rückruf:

int client = (int)pData; 
1

Ich weiß nicht viel über die timersys-> CreateTimer Implementierung, sondern „int-Client“ ist lokal für Event_PlayerSpawn und wird wahrscheinlich durch die Zeit PlayerSpawnTimer freigegeben :: OnTimer aufgerufen wird.

Wenn Sie wirklich ein void * anstelle eines int übergeben müssen, müssen Sie möglicherweise "new" und "delete" verwenden, um sicherzustellen, dass der Speicher für "int client" ordnungsgemäß zugewiesen und freigegeben wird.

Verwandte Themen