[英]Access violation reading location 0xFFFFFFFFFFFFFFFF
我正在嘗試使用OpenGL演示分層動畫。 在早期階段,我試圖給“骨骼”對象一個對其父對象的引用。
在我的骨骼類中,我可以成功添加一個父對象,但是問題是當我調用hasParent()
。 它無法讀取this-> parent並由於以下異常而崩潰:
myprogram.exe中0x00007FF6CB723D43的未處理異常:0xC0000005:訪問沖突讀取位置0xFFFFFFFFFFFFFFFF。**
我的骨骼課程片段:
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
參見,例如, “靜態常量”與“ #define”與“枚舉”
加
parent = NULL;
child = NULL;
到第二個構造函數Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S)
由@drescherjm解決:
我需要在Bone :: Bone中初始化'parent = NULL'(int ID,glm :: vec3 T,glm :: vec3 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";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.