访问冲突读取位置 0xFFFFFFFFFFFFFFFF
Access violation reading location 0xFFFFFFFFFFFFFFFF
我正在尝试使用 OpenGL 来演示分层动画。在早期阶段,我试图为我的 "bone" 对象提供对其父对象的引用。
在我的骨子里 class,我可以成功添加父对象,但是问题是在我调用 hasParent()
时。它无法读取 this->parent 并因以下异常而崩溃:
Unhandled exception at 0x00007FF6CB723D43 in myprogram.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.**
我的骨头片段class:
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;
}
我发现引用和指针很难理解,所以我希望这对其他人来说是显而易见的!
编辑:
我的构造函数:
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";
}
你不需要
assert(this->parent)
在 Bone::hasParent() 的第一行。断言某事意味着您期望它始终为真。但是,为什么首先要有函数 hasParent() 呢?当执行此行并且未初始化父级时,您的程序会崩溃。如果您删除断言,它应该可以工作。
那么你也应该在第二个构造函数中初始化 parent 和 child(大概使用 nullptr)。
与您的问题无关,但为了改进您的C++ 风格,您不应使用#define 来定义常量。请改用 const,例如
const unsigned int NUM_BONES
参见,例如,"static const" vs "#define" vs "enum"
添加
parent = NULL;
child = NULL;
到第二个构造函数Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S)
由@drescherjm 解决:
我需要在 Bone::Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S)
中初始化 'parent = NULL'
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";
}
我正在尝试使用 OpenGL 来演示分层动画。在早期阶段,我试图为我的 "bone" 对象提供对其父对象的引用。
在我的骨子里 class,我可以成功添加父对象,但是问题是在我调用 hasParent()
时。它无法读取 this->parent 并因以下异常而崩溃:
Unhandled exception at 0x00007FF6CB723D43 in myprogram.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.**
我的骨头片段class:
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;
}
我发现引用和指针很难理解,所以我希望这对其他人来说是显而易见的!
编辑:
我的构造函数:
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";
}
你不需要
assert(this->parent)
在 Bone::hasParent() 的第一行。断言某事意味着您期望它始终为真。但是,为什么首先要有函数 hasParent() 呢?当执行此行并且未初始化父级时,您的程序会崩溃。如果您删除断言,它应该可以工作。
那么你也应该在第二个构造函数中初始化 parent 和 child(大概使用 nullptr)。
与您的问题无关,但为了改进您的C++ 风格,您不应使用#define 来定义常量。请改用 const,例如
const unsigned int NUM_BONES
参见,例如,"static const" vs "#define" vs "enum"
添加
parent = NULL;
child = NULL;
到第二个构造函数Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S)
由@drescherjm 解决:
我需要在 Bone::Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S)
中初始化 'parent = NULL'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";
}