2016-02-16 3 views
1

J'essaye d'utiliser OpenGL pour démontrer l'animation hiérarchique. Au début, j'essaie de donner à mon objet "osseux" une référence à son parent.Accédez à l'emplacement de lecture de violation 0xFFFFFFFFFFFFFFFF

Dans ma classe d'os, je peux ajouter un parent avec succès mais le problème est quand j'appelle hasParent(). Il ne peut pas lire this-> parent et accidents à l'exception suivante:

exception non gérée à 0x00007FF6CB723D43 dans myprogram.exe: 0xC0000005: violation. Accès lieu de lecture 0xFFFFFFFFFFFFFFFF **

Snippets de mon classe d'os:

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; 
} 

dépouillée contenu de mon principal:

#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; 
} 

Je trouve les références et les pointeurs difficiles à comprendre, alors j'espère que c'est évident pour quelqu'un d'autre!

EDIT:

Mes constructeurs:

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"; 

} 
+0

Vous pouvez trouver cela beaucoup plus facile si vous exécutez ceci dans le débogueur, et obtenez une trace de la pile d'où l'erreur s'est produite. –

+3

Veuillez montrer le constructeur de la classe 'Bone'. Est-ce qu'il initialise 'parent'? –

+1

Quelle ligne de code provoque la panne? – wallyk

Répondre

3

Ajouter

parent = NULL; 
child = NULL; 

au second constructeur Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S)

+1

Idéalement, cela devrait être fait dans la liste des initialiseurs. Ce n'est pas si important pour les types primitifs, mais par exemple, si le paramètre 'boneModel' le définit dans le constructeur, le constructeur mat4 par défaut s'exécutera inutilement. – BDL

4

Vous n'avez pas besoin

assert(this->parent) 

dans la première ligne d'os :: hasParent(). Affirmer quelque chose signifie que vous vous attendez à ce que ce soit toujours vrai. Mais alors pourquoi avez-vous la fonction hasParent() en premier lieu? Lorsque cette ligne est exécutée et que le parent n'est pas initialisé, votre programme se bloque. Cela devrait fonctionner si vous supprimez l'affirmation.

Ensuite, vous devez également initialiser parent & enfant dans le deuxième constructeur (probablement avec nullptr).

Sans rapport avec votre problème, mais pour améliorer votre style C++, vous ne devez pas utiliser # define pour définir des constantes. Utilisez const à la place, par ex.

const unsigned int NUM_BONES 

Voir, par exemple, "static const" vs "#define" vs "enum"

+0

Toujours obtenir la même erreur avec la ligne après if (this-> parent) si l'assert est retiré – Claire

+0

Cela ne peut pas être la raison de cette erreur ... Le problème est que le parent n'est pas initialisé dans tous les constructeurs – wallycz

+0

@Claire Even Bien que cette affirmation ne soit pas votre problème actuel, elle le deviendra dès que vous appellerez hasParent() sur un Bone qui n'en a pas. – alex

0

Résolu par @drescherjm:

je avais besoin pour initialiser 'parent = NULL' dans Bone :: Bone (identifiant int, glm :: vec3 T, glm :: ve c3 R, glm :: vec3 S)

Bone::Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S) 
{ 
    parent = NULL; 
    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"; 

} 
+3

Initialiser l'enfant également. – drescherjm