为什么我的变量被覆盖了?

Why are my variables written over?

这在 Unreal Engine 中,所以确实使用了其中的一些代码,但这应该是我遇到的标准 C++ 问题,因此我将其张贴在这里。我对指针知之甚少,所以可能搞砸了这里的东西。

编写自动化测试,但这在大多数情况下应该无关紧要。

我有一些整数,其中 2 个没有保留我存储在其中的值。这是我当前的代码(带有我用来调试的额外不必要的东西:

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 commands are asyncrhonous. They are queued up in order, and the next one will not run until the previous has returned true. I pass as pointers and reference the values inside for all times I use these specific variables, as they are all queued up right away based on their values before the first latent command has been completed.

所以违规者是 int32 StartXPNoBuff 和 EndXPNoBuff。初始化为0,在第一个Latent WoodChop函数中设置(暂时每次应该分别为0和34)

如 Test() 潜在命令所示,它们设置正确。测试潜在命令输出 "Var1: [StartXPNoBuff], Var2: [EndXPNoBuff]"。这是我每次得到的值 运行:

变量 1:0,变量 2:34 变量 1:0,变量 2:0 Var1:-2,Var2:157761904 Var1:-2,Var2:157761904

直到最后的潜在命令(其他tahn我的调试命令)我才使用这些变量,所以这些值不应该改变。

在得到别人的帮助后,我将 UPROPERTY() 放在每个变量的前面,但这没有任何区别,每个变量都有一个指针变量,但这没有区别,似乎没有任何作用。

StartXPBuff 和 EndXPBuff 的工作方式完全相同,它们的值是从完全相同的方法中设置的,但是它们保留了它们的值并且没有问题。为什么我不能让它在前 2 个工作?

如果没有周围的代码,我假设所有呈现的内容都在 RunTest() 函数内,用于简单或复杂的 Unreal 自动化测试。

将测试函数中局部变量(&StartXPNoBuff)的指针传递给潜在命令将产生随机结果。测试函数完成后,局部变量将超出范围。当潜在函数在下一帧运行时,它只有一个悬空指针可以使用。它将指向随机内存...
如果这些变量需要保留在帧之间,找个地方存储它们:UWorld 中的 AActor,测试文件中分配的全局变量等...只需找到可以在帧与帧之间持续的东西。