Это в 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));
ОК, поэтому скрытые команды асинхронны. Они стоят в очереди по порядку, и следующий не будет работать, пока предыдущий не вернул true. Я передаю в качестве указателей и обращаюсь к значениям внутри во всех случаях, когда использую эти конкретные переменные, поскольку все они сразу ставятся в очередь на основе их значений до того, как первая скрытая команда будет выполнена.
Таким образом, нарушителями являются int32 StartXPNoBuff и EndXPNoBuff. Они инициализируются равными 0 и устанавливаются (в настоящее время это должно быть 0 и 34 соответственно каждый раз) в первой функции скрытого WoodChop.
Они установлены правильно, как показывает скрытая команда Test (). Тестовая скрытая команда выдает «Var1: [StartXPNoBuff], Var2: [EndXPNoBuff]». Вот значения, которые я получаю при каждом запуске:
Вар1: 0, Вар2: 34
Вар1: 0, Вар2: 0
Вар1: -2, Вар2: 157761904
Вар1: -2, Вар2: 157761904
Я не использую эти переменные до последней скрытой команды (кроме моих команд отладки), поэтому значения не должны изменяться.
После получения помощи от других я поставил UPROPERTY () перед каждой переменной, но это не имело значения, у меня была переменная-указатель для каждой, но это не имеет значения, кажется, ничего не работает.
StartXPBuff и EndXPBuff работают точно так же, их значения устанавливаются из одного и того же метода EXACT, однако они сохраняют свои значения, и с ними проблем нет. Почему я не могу заставить это работать для первых 2?
Без окружающего кода, я предполагаю, что все представленное внутри функции RunTest () для простого или сложного Unreal Automated test.
Передача указателя на локальную переменную (&StartXPNoBuff) в тестовой функции для скрытой команды будет иметь случайные результаты. Локальная переменная выйдет из области видимости после завершения тестовой функции. Когда скрытая функция запускается во время следующего кадра, у нее просто есть свисающий указатель для работы. Это будет указывать на случайную память …
Если эти переменные нужно хранить между кадрами, найдите место для их хранения: AActor в UWorld, глобальная переменная, размещенная в тестовом файле и т. Д. Просто найдите что-то, что будет длиться от кадра к кадру.
Других решений пока нет …