При вызове класса C ++ из контроллера представления происходит сбой - PullRequest
0 голосов
/ 12 июля 2010

У меня есть объект C ++, на который я получаю ссылку в своем контроллере вида, например:

m_applicationEngine = (ApplicationEngine *)[(GLView *)[self.parentViewController view] m_applicationEngine];

В моем делегате местоположения я вызываю метид в классе следующим образом:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation       *)newLocation fromLocation:(CLLocation *)oldLocation {
 CLLocationCoordinate2D coordinate = [newLocation coordinate];

 NSLog(@"Location acquired %f, %f", coordinate.latitude, coordinate.longitude);
 myLocation = new Location(coordinate.latitude, coordinate.longitude);

 m_applicationEngine->GotoLoc(myLocation);
 }

Вызывается функция GotoLoc, но происходит сбой при первом обращении к общедоступной переменной-члену экземпляра m_applicationEngine.Я уверен, что член уже был инициализирован.У кого-нибудь есть идеи?

m_applicationEngine - это объект C ++, инициализированный в initWithFrame () в GLView: UIView.

m_applicationEngine = new ApplicationEngine(m_renderingEngine, self);

Вот код GotoLoc ().Первый раз он ссылается на m_rotation, которая является переменной-членом класса, в котором происходит сбой.Я могу вызвать GotoLoc () в других областях кода, только не в вышеупомянутой функции делегата Obj-C.

void ApplicationEngine::GotoLoc(Location *location) {
vec3 eye = vec3(0, 0, 1);
vec3 end = location->loc;

// Compute the difference between where we're looking at now vs. where we want to point
mat4 transpose;
MatrixTranspose(transpose, m_rotation);
MatrixVec3Multiply(eye, eye, transpose);

//cout << "Inverse.  I was here x:" << relativeVec.x << " y:" << relativeVec.y << " z:" << relativeVec.z << endl;

// bring vectors down to the equator to measure x angle
vec3 relativeX = vec3(eye.x, 0, eye.z);
// reference vector is the rotation axis for the sign to be correct
float xAngle = signed_angle(relativeX, vec3(end.x, 0, end.z), vec3(0,-1,0));

mat4 rotationX;
MatrixRotationY(rotationX, -1 * xAngle);
MatrixMultiply(m_rotation, rotationX, m_rotation);

// need to rotate eye vector to line up on y with new target to measure y angle
MatrixTranspose(transpose, rotationX);
MatrixVec3Multiply(eye, eye, transpose);
float yAngle = signed_angle(eye, end, vec3(1,0,0));

cout << "Went to difference of: ANGLE x: " << RADIANS_TO_DEGREES(xAngle) << " y:" << RADIANS_TO_DEGREES(yAngle) << endl;

mat4 rotationY;
MatrixRotationX(rotationY, -1 * yAngle);
MatrixMultiply(m_rotation,  m_rotation, rotationY);

}

1 Ответ

0 голосов
/ 12 июля 2010

Лучшее предположение по информации, которую вы нам предоставили, это то, что m_applicationEngine на самом деле не является объектом C ++. Где ты это создаешь? в init? в аксессоре m_applcationEngine?

Если вы хотите получить лучший ответ, чем этот, покажите нам код GotoLoc () и как вы инициируете объект C ++.

Редактировать (следующий новый опубликованный код):

Я думаю, m_applicationEngine - ноль. Вы должны быть в состоянии подтвердить это, поставив разрыв в первой строке GotoLoc() и проверив this (это правильно для C ++? Мне нужен эквивалент self) указателя.

Если ваше представление находится в nib-файле, у меня есть ощущение, что вместо 10101 * используется initWithCoder:, что объясняет, почему ваш объект C ++ никогда не создается. Самый простой способ исправить это - создать и получить к нему доступ через свойство и инициализировать его при первом использовании, например,

// .h file

@property (readonly, assign) ApplicationEngine* applicationEngine;

//  .m file

-(ApplicationEngine*) applicationEngine
{
    if (m_applicationEngine == NULL)
    {
        m_applicationEngine = new ApplicationEngine(m_renderingEngine, self);
    }
    return m_applicationEngine;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...