为什么我的变量被写了?

时间:2016-04-07 13:16:02

标签: c++ pointers automated-tests unreal-engine4 out-parameters

这是在虚幻引擎中,所以使用了一些代码,但是这应该是我所知道的标准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));
  

好的,所以Latent命令是异常的。它们按顺序排队,下一个在前一个返回true之前不会运行。我使用这些特定变量时,作为指针传递并引用内部值,因为它们在第一个潜在命令完成之前根据它们的值立即排队。

因此违规者是int32 StartXPNoBuff和EndXPNoBuff。它们被假定为0,并且在第一个潜在的WoodChop函数中设置(暂时,它应该分别为0和34)。

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

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

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

在得到其他人的帮助之后,我把UPROPERTY()放在每个变量的前面,但没有区别,每个变量都有一个指针变量,但这没什么区别,似乎没什么用。

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

1 个答案:

答案 0 :(得分:1)

如果没有周围的代码,我假设所有出现的内容都在RunTest()函数内部进行简单或复杂的虚幻自动测试。

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

相关问题