NVIDIA Необработанное исключение в 0x002a2da2 в & lt; work.exe & gt; 0xC0000005: расположение чтения нарушения доступа 0x00000000

В настоящее время я пытаюсь сделать две руки на персонажа и использовать 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);

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(...));
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]