Доступ к месту чтения нарушения при назначении числа с плавающей запятой (0x0000000000000170) - PullRequest
0 голосов
/ 18 декабря 2018

У меня сбой из-за местоположения чтения нарушения прав доступа.Я делаю это в Unreal Engine, но это просто, и я чувствую, что проблема должна быть универсально применима в C ++, хотя я новичок в этом.

Я сбой при попытке назначить LastDoorOpenTime в OpenDoor () изOpenDoor.cpp (ниже).Я могу назначить его успешно при запуске программы в UOpenDoor :: BeginPlay (), но при попытке выполнить то же самое в OpenDoor () происходит сбой приложения с «Местом чтения нарушения прав доступа».

OpenDoor.ч:

#pragma once

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "GameFramework/Actor.h"
#include "Engine/TriggerVolume.h"
#include "Engine/World.h"
#include "OpenDoor.generated.h"


UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class ESCAPEROOM_API UOpenDoor : public UActorComponent
{
    GENERATED_BODY()

public: 
    // Sets default values for this component's properties
    UOpenDoor();

protected:
    // Called when the game starts
    virtual void BeginPlay() override;

    void OpenDoor();

    void CloseDoor();

public: 
    // Called every frame
    virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;

private:
    UPROPERTY(VisibleAnywhere)
        float OpenAngle = -60.f;

    UPROPERTY(EditAnywhere)
        ATriggerVolume* PressurePlate;

    UPROPERTY(EditAnywhere)
        float DoorCloseDelay = 1.f;

    float LastDoorOpenTime;

    AActor* ActorThatOpens;

    AActor* Owner;

    bool IsDoorOpen;

    UWorld* ThisWorld;
};

OpenDoor.cpp:

#include "OpenDoor.h"

// Sets default values for this component's properties
UOpenDoor::UOpenDoor()
{
    // Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features
    // off to improve performance if you don't need them.
    PrimaryComponentTick.bCanEverTick = true;

    // ...
}


// Called when the game starts
void UOpenDoor::BeginPlay()
{
    Super::BeginPlay();
    ThisWorld = GetWorld();
    ActorThatOpens = ThisWorld->GetFirstPlayerController()->GetPawn();
    AActor* Owner = GetOwner();
    IsDoorOpen = false;
}

void UOpenDoor::OpenDoor()
{
    Owner->SetActorRotation(FRotator(0.f, OpenAngle, 0.f));
    int cow = 1 + 1;
    LastDoorOpenTime = 0.f; //ACCESS VIOLATION HERE
    IsDoorOpen = true;
}

void UOpenDoor::CloseDoor()
{
    Owner->SetActorRotation(FRotator(0.f, 0.f, 0.f));
    IsDoorOpen = false;
}


// Called every frame
void UOpenDoor::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
    Super::TickComponent(DeltaTime, TickType, ThisTickFunction);

    if (PressurePlate->IsOverlappingActor(ActorThatOpens)) {
        OpenDoor();
    }

    if (IsDoorOpen) {
        if (ThisWorld->GetTimeSeconds() >= LastDoorOpenTime + DoorCloseDelay) {
            CloseDoor();
        }
    }
}

1 Ответ

0 голосов
/ 18 декабря 2018

Изменение: «AActor * Owner = GetOwner ();»to "Владелец = GetOwner ();"исправил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...