0

Ceci est dans Unreal Engine donc utilise un peu de code de cela, mais cela DEVRAIT être un problème C++ standard que j'ai de ce que je peux dire par conséquent pourquoi je l'affiche ici. Je sais peu de choses sur les pointeurs, donc probablement foiré quelque chose ici.Pourquoi mes variables sont-elles écrasées?

Écrire un test d'automatisation, mais cela ne devrait pas être important pour la plupart.

J'ai quelques entiers, et 2 d'entre eux ne gardent pas les valeurs que je stocke dedans. Voici mon code actuel (avec des trucs unneccesary supplémentaires J'utilise pour déboguer:

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, donc les commandes Latent sont asyncrhonous Ils sont mis en attente dans l'ordre, et la suivante ne fonctionnera pas jusqu'à ce que la précédente. est revenu vrai. Je passe en tant que pointeurs et de référence les valeurs à l'intérieur de tous les temps que j'utilise ces variables spécifiques, car ils sont tous mis en attente tout de suite en fonction de leurs valeurs avant la première commande latente est terminée.

Alors les délinquants sont int32 StartXPNoBuff et EndXPNoBuff, ils sont initialisés à 0, et réglés (pour le moment, il faut 0 et 34 respectivement à chaque fois) dans la première fonction Latent WoodChop.

Ils sont définis correctement, comme le montre la commande latente Test(). La commande latente de test sort "Var1: [StartXPNoBuff], Var2: [EndXPNoBuff]". Voici les valeurs que je Sors de chaque fois qu'il est exécuté:

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

Je n'utilise pas ces variables jusqu'à la commande latente finale (autre tahn mes commandes de débogage), donc les valeurs ne devraient pas changer. Après avoir pris l'aide des autres, j'ai mis UPROPERTY() devant chaque variable mais cela n'a fait aucune différence, j'ai eu une variable de pointeur pour chacun, mais cela ne fait aucune différence, rien ne semble fonctionner.

StartXPBuff et EndXPBuff fonctionnent exactement de la même manière, leurs valeurs sont définies à partir de la même méthode EXACT, mais celles-ci conservent leurs valeurs et ne posent aucun problème. Pourquoi ne puis-je pas obtenir cela pour les 2 premiers?

+0

Que fait la méthode 'Test'? Puisque vous passez des références des variables qui sont changées au hasard, semble être le coupable. – Nacho

+0

Ceci affiche simplement leurs valeurs. Le problème était là avant la méthode de test, la méthode de test a été mis en place pour aider à le dépister. – pingu2k4

+0

Votre fonction atteint-elle un '}' avant la fin des commandes asynchrones? –

Répondre

1

Sans le code environnant, je suppose que tout ce qui est présenté est à l'intérieur d'une fonction RunTest() pour un test Unreal Automated simple ou complexe. Passer le pointeur vers une variable locale (& StartXPNoBuff) dans la fonction de test vers une commande latente aura des résultats aléatoires. La variable locale sortira de la portée après la fin de la fonction de test. Lorsque la fonction latente s'exécute pendant la trame suivante, elle a juste un pointeur qui fonctionne. Il pointera sur la mémoire aléatoire ...
Si ces variables doivent être conservées entre les trames, trouvez un endroit pour les stocker: Un AActor dans UWorld, une variable globale allouée dans le fichier de test, etc ... Il suffit de trouver quelque chose qui va durer d'une image à l'autre.