2016-04-07 17 views
0

Dies ist in der Unreal Engine, so verwendet einige Code von diesem, aber das sollte ein Standard C++ - Problem sein, das ich von dem habe, was ich sagen kann, warum ich es hier poste. Ich weiß wenig über Zeiger, also habe ich hier wahrscheinlich etwas durcheinander gebracht.Warum werden meine Variablen überschrieben?

Einen Automatisierungstest schreiben, aber das sollte eigentlich keine Rolle spielen.

Ich habe einige Ganzzahlen, und 2 von ihnen halten nicht die Werte, die ich in ihnen speichern. Hier ist meine aktuellen Code ist (mit extra unneccesary Sachen, die ich zu debuggen bin mit:

UPROPERTY() 
    ARSRPlayerCharacter* PlayerCharacterX = TestUtils::GetFirstPlayerCharacterServer(); 
    UPROPERTY() 
    ARSRPlayerCharacter* PlayerCharacterY = TestUtils::GetAdditionalPlayerCharacterServer(2); 
    UPROPERTY() 
    int32 StartXPNoBuff = 0; 
    UPROPERTY() 
    int32 EndXPNoBuff = 0; 
    UPROPERTY() 
    int32 StartXPBuff = 0; 
    UPROPERTY() 
    int32 EndXPBuff = 0; 
    UPROPERTY() 
    int32 PlayerWoodcuttingXP = 0; 

    UPROPERTY() 
    int32* StartXPNoBuffPtr = &StartXPNoBuff; 
    UPROPERTY() 
    int32* EndXPNoBuffPtr = &EndXPNoBuff; 
    UPROPERTY() 
    int32* StartXPBuffPtr = &StartXPBuff; 
    UPROPERTY() 
    int32* EndXPBuffPtr = &EndXPBuff; 

    PlayerWoodcuttingXP = PlayerCharacterX->SkillsComponent->GetWoodcuttingXP(); 

    ADD_LATENT_AUTOMATION_COMMAND(ChopWood(PlayerCharacterX, PlayerWoodcuttingXP, true, StartXPNoBuff, EndXPNoBuff)); 

    ADD_LATENT_AUTOMATION_COMMAND(Test(&StartXPNoBuff, &EndXPNoBuff)); 

    ADD_LATENT_AUTOMATION_COMMAND(FWaitLatentCommand(5.0f)); 

    ADD_LATENT_AUTOMATION_COMMAND(Test(&StartXPNoBuff, &EndXPNoBuff)); 

    ADD_LATENT_AUTOMATION_COMMAND(TeleportPlayer(PlayerCharacterY, FVector(5499.0f, 2848.0f, 215.0f))); 

    ADD_LATENT_AUTOMATION_COMMAND(Test(&StartXPNoBuff, &EndXPNoBuff)); 

    ADD_LATENT_AUTOMATION_COMMAND(ChopWood(PlayerCharacterX, PlayerWoodcuttingXP, true, StartXPBuff, EndXPBuff)); 

    ADD_LATENT_AUTOMATION_COMMAND(Test(&StartXPNoBuff, &EndXPNoBuff)); 

    ADD_LATENT_AUTOMATION_COMMAND(CheckXPImproves(this, StartXPNoBuffPtr, EndXPNoBuffPtr, StartXPBuffPtr, EndXPBuffPtr)); 

OK, so Latent-Befehle sind asyncrhonous Sie werden in der Reihenfolge der Warteschlange, und der nächste wird erst ausgeführt, wenn die vorherige. zurückgekehrt ist wahr. ich als Zeiger übergeben und die Werte Referenz für alle Zeiten innerhalb ich diese spezifischen Variablen verwenden, da sie alle Warteschlange gestellt sofort auf der Grundlage ihrer Werte werden vor dem ersten latenten Befehl abgeschlossen ist.

so die Täter sind int32 StartXPNoBuff und EndXPNoBuff, sie werden auf 0 initialisiert und gesetzt (vorerst sollte es sein 0 und 34 jeweils) in der ersten Latent WoodChop-Funktion.

Sie sind korrekt eingestellt, wie der latente Befehl Test() anzeigt. Der Test-Latenz-Befehl gibt "Var1: [StartXPNoBuff], Var2: [EndXPNoBuff]" aus. Hier sind die Werte, die ich von jeder Zeit aussteigen es ausgeführt wird:

Var1: 0, Var2: 34 Var1: 0, Var2: 0 Var1: -2, Var2: 157761904 Var1: -2, Var2: 157761904

Ich benutze diese Variablen nicht bis zum letzten latenten Befehl (anders bei meinen Debug-Befehlen), also sollten sich die Werte nicht ändern.

Nachdem ich von anderen Hilfe geholt hatte, setzte ich UPROPERTY() vor jede Variable, aber das machte keinen Unterschied, hatte eine Zeigervariable für jeden, aber das macht keinen Unterschied, Nichts scheint zu funktionieren.

StartXPBuff und EndXPBuff arbeiten genau auf die gleiche Weise, ihre Werte werden innerhalb der EXACT gleichen Methode gesetzt, aber diese behalten ihre Werte und es gibt kein Problem damit. Warum kann ich das nicht für die ersten 2 schaffen?

+0

Was macht die 'Test'-Methode? Da Sie Referenzen der Variablen übergeben, die zufällig geändert werden, scheint wahrscheinlich der Täter zu sein. – Nacho

+0

Dies gibt nur ihre Werte aus. Das Problem war dort vor der Testmethode, die Testmethode wurde eingefügt, um das Auffinden zu erleichtern. – pingu2k4

+0

Erreicht Ihre Funktion ein '}', bevor die Async-Befehle abgeschlossen sind? –

Antwort

1

Ohne den umgebenden Code gehe ich davon aus, dass alles, was präsentiert wird, innerhalb einer RunTest() - Funktion für einen einfachen oder komplexen Unreal Automated Test ist.

Wenn Sie den Zeiger auf eine lokale Variable (& StartXPNoBuff) in der Testfunktion an einen latenten Befehl übergeben, werden zufällige Ergebnisse angezeigt. Die lokale Variable wird nach Abschluss der Testfunktion nicht mehr verwendet. Wenn die latente Funktion während des nächsten Frames ausgeführt wird, verfügt sie nur über einen freien Zeiger, mit dem gearbeitet werden kann. Es wird auf zufälligen Speicher zeigen ...
Wenn diese Variable zwischen Frames gehalten werden muss, finden Sie irgendwo, um sie zu speichern: Ein AActor in der UWorld, eine globale Variable in der Testdatei usw., ... Finden Sie etwas, das wird von Frame zu Frame dauern.

Verwandte Themen