1. ホーム
  2. c++

[解決済み] 場所 0xFFFFFFFFFFFF を読み取るアクセス違反。

2022-02-19 18:21:40

質問

OpenGLを使って、階層型アニメーションのデモをしようとしています。初期段階では、私は私の"bone"オブジェクトに、その親への参照を与えようとしています。

私のボーンクラスでは、正常に親を追加することができますが、問題は私が hasParent() . this->parent を読み込むことができず、以下の例外が発生してクラッシュします。

myprogram.exe の 0x00007FF6CB723D43 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0xFFFFFFFFFFFFFFFFFF.** 。

私のボーン・クラスからのスニペット。

void Bone::addParent(Bone *bone)
{
    this->parent = bone;
    assert(this->parent);
}

bool Bone::hasParent()
{
    assert(this->parent); //this line causes the error
    if (this->parent)
        return true;
    else return false;
}

glm::mat4 Bone::getBoneModel()
{
    glm::mat4 parentModel = glm::mat4(1.0);
    if (hasParent())
        parentModel = parent->getBoneModel();
    //boneModel = parentModel * boneModel;
    return boneModel;
}

私のメインの内容を削ぎ落としたもの。

#define NUMBONES 3
Bone bone[NUMBONES];

int main( void )
{
    //------------------ Create Bones --------------------------
    float y = 0.0f;
    for (int i = 0; i < NUMBONES; i++)
    {
        bone[i] = Bone(i, vec3(0, y, -30), vec3(0, 0, 0), vec3(0, 0, 0));
        y += 5.0f;
    }

    //----------------- Make relationships ----------------
    bone[0].isRoot = true;
    bone[0].addChild(&bone[1]);
    bone[0].addChild(&bone[2]);
    bone[1].addParent(&bone[0]);
    bone[1].addChild(&bone[2]);
    bone[2].addParent(&bone[1]);

    do{
        ModelMatrix = bone[1].getBoneModel();
    }
    return 0;
}

私はリファレンスとポインターを理解するのが難しいと思うので、他の誰かにとっては当たり前のことなのだと思います

EDIT

私のコンストラクタ

Bone::Bone() {
    parent = NULL;
    child = NULL;
    boneID = 0;
    boneModel = glm::mat4(1.0);
}

Bone::Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S)
{
    boneID = ID;
    isRoot = false;
    pos = T;

    //---------- set boneModel ------------------
    glm::mat4 RotationMatrix = glm::mat4(1.0);
    glm::mat4 TranslationMatrix = translate(glm::mat4(), pos);
    glm::mat4 ScalingMatrix = scale(glm::mat4(), glm::vec3(1.0f, 1.0f, 1.0f));
    boneModel = TranslationMatrix * RotationMatrix * ScalingMatrix;

    std::cout << "bone[" << boneID << "] created.\n";

}

解決方法は?

追加

parent = NULL;
child = NULL;

を第2コンストラクタへ Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S)