В настоящее время я пытаюсь сделать две руки на персонажа и использовать NxRevoluteJoint для его движения. У меня они отлично работают в другой программе, которая была приведена в качестве примера, и я использовал тот же код в этом новом проекте, однако я получаю ошибку (ту, что в названии), и я изо всех сил пытаюсь ее исправить. Я понимаю, что указатели — это ссылка на NULL в каком-то месте, но я не понимаю, как с этим разобраться.
Переменные установлены глобально:
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);
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(...));
Других решений пока нет …