Собственная ошибка, приводящая к нарушению прав чтения (C ++ / OpenGL) - PullRequest
0 голосов
/ 04 мая 2018

Я звоню slerp() из Собственной библиотеки следующим образом:

Eigen::MatrixXf Rtime = (Eigen::Quaternionf::Identity().slerp(timer, quarts[i])).toRotationMatrix();

, где timer - это число с плавающей запятой, а кварты объявляются как

std::vector<Eigen::Quaternionf> quarts;

Этот вызов slerp иногда вызывает Нарушение прав чтения (примерно в 50% случаев), что меня смущает.

Глядя на кадр стека, Stack Frame Я вижу, что код достигает Eigen::internal::pload, пока не сломается.

Обычно я думаю, что мои индексы неверны, но он падает, даже когда i = 0 и quarts.size() = 1. Я объявляю единственный кватернион в векторе:

Eigen::Matrix3f rotMatrix;
    rotMatrix = U * V;
    Eigen::Quaternionf temp;
    temp = rotMatrix;
    quarts.push_back(temp);

где U и V получены из вычисления разложения по сингулярным значениям, так что, может быть, что-то не так с тем, как я объявляю кватернион? Или хранение в векторе каким-то образом влияет на это? Я не уверен.

1 Ответ

0 голосов
/ 04 мая 2018

Проблема в том, что для Quaternionf требуется 16-байтовое выравнивание, которое не гарантируется std::vector. Подробнее там . Решения должны состоять в том, чтобы использовать выровненный распределитель, например:

std::vector<Quaternionf,Eigen::aligned_allocator<Quaternionf>> quats;

или использовать невыровненные кватернионы внутри вектора:

std::vector<Quaternion<float,Eigen::DontAlign>> quats;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...