2013-01-01 77 views
1

我目前正在嘗試對角色製作兩個手臂,並使用NxRevoluteJoint進行移動。我有這些工作完全在已給出的例子的又一個計劃,我已經使用了相同的代碼在這個新項目,但是我正在一個錯誤(一個標題),我掙扎着如何解決它。我明白指針在某些地方是指向NULL,但我看不出如何對它進行排序。在0x002a2da2處出現NVIDIA未處理異常<work.exe> 0xC0000005:訪問衝突讀取位置0x00000000

的變量是全局設置:

NxRevoluteJoint* playerLeftJoint= 0; 
NxRevoluteJoint* playerRightJoint= 0; 

這是單獨的函數的代碼,玩家被建成一個複合對象:

NxVec3 globalAnchor(0,1,0);  
NxVec3 globalAxis(0,0,1);  

playerLeftJoint= CreateRevoluteJoint(0,actor2,globalAnchor,globalAxis); 
playerRightJoint= CreateRevoluteJoint(0,actor2,globalAnchor,globalAxis); 


//set joint limits 
NxJointLimitPairDesc limit1; 
limit1.low.value = -0.3f; 
limit1.high.value = 0.0f; 
playerLeftJoint->setLimits(limit1); 


NxJointLimitPairDesc limit2; 
limit2.low.value = 0.0f; 
limit2.high.value = 0.3f; 
playerRightJoint->setLimits(limit2);  

NxMotorDesc motorDesc1; 
motorDesc1.velTarget = 0.15; 
motorDesc1.maxForce = 1000; 
motorDesc1.freeSpin = true; 
playerLeftJoint->setMotor(motorDesc1); 

NxMotorDesc motorDesc2; 
motorDesc2.velTarget = -0.15; 
motorDesc2.maxForce = 1000; 
motorDesc2.freeSpin = true; 
playerRightJoint->setMotor(motorDesc2); 

在那裏我得到的線誤差在playerLeftJoint->setLimits(limit1);

+0

'NxRevoluteJoint * playerLeftJoint = 0;'你提領一個空指針。 –

+0

我該如何去解除它的引用? – Defterniko

+0

在使用之前指向現有的'NxRevoluteJoint'。類似的正確聯合。 –

回答

1

CreateRevoluteJoint返回一個空指針,就這麼簡單。該錯誤消息非常清楚指針的值爲0。當然,你沒有發佈這個功能,所以這是我可以給你的最好的信息。因此,這條線;

playerLeftJoint->setLimits(limit1); 

解除引用指針playerLeftJoint,這是一個無效指針。你需要初始化你的指針。我看不到你的整個程序結構,所以在這種情況下,最簡單的修復就是這樣的;

if(!playerLeftJoint) 
    playerLeftJoint = new NxRevoluteJoint(); 

// same for the other pointer, now they are valid 

此外,因爲這是C++而不是C,使用智能指針來處理內存給你,即

#include <memory> 

std::unique_ptr<NxRevoluteJoint> playerLeftJoint; 

// or, if you have a custom deallocater... 
std::unique_ptr<NxRevoluteJoint, RevoluteJointDeleter> playerLeftJoint; 

// ... 

playerLeftJoint.reset(new NxRevoluteJoint(...)); 
+0

它是合理的假設有一個自定義刪除他的使用與分配功能'CreateRevoluteJoint'一起去的API函數,如果是這樣,不應該將智能指針使用包括定製刪除模板參數,以確保正確的清除功能被調用,因爲它可能不是一個簡單的堆分配使用operator new()'? – WhozCraig

+0

@WhozCraig:可能。但是,這是論壇帖子,而不是一個包羅萬象的解決方案。我不知道這是他的功能還是一個API函數。如果OP有額外的約束沒有在帖子中顯示,那麼他應該能夠使用這個答案,並迎合他的需求。這是一個很好的建議,我會加上它。 –

+0

謝謝@EdS加入智能指針已經修復了我的工作,真的很感激。想想我會去讀一讀,以更好地理解這些。 只是爲了將來refernece如果任何人遇到這樣的 '如果(playerLeftJoint!)'' = playerLeftJoint新NxRevoluteJoint();' 沒有工作,因爲它不是一個抽象類,但我敢肯定它會爲工作標準C++的工作,因爲它有頂級的Nvidia API – Defterniko

相關問題