2016-08-10 2 views
2

У меня есть класс, который находит выпуклую оболочку двумерного множества точек. Он содержит структуру, которая содержит 2 Eigen::Matrix<double, 2, 1>. Похоже, что это (со многими вещами удалены):Собственный равнозначный массив assert

class Foo{ 
public: 
    Foo(Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>); 

private: 
    struct edge{ 
     unsigned int a; 
     unsigned int b; 
     Eigen::Matrix<double, 2, 1> slope; 
     double mag; 
     Eigen::Matrix<double, 2, 1> normal; 
     std::vector<unsigned int> list; 
    }; 

    Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> points; 
    std::vector<edge> edges 
}; 

Я получаю сообщение об ошибке утверждения при добавлении ребра к вектору edges так:

void Foo::DoThing(){ 
    edges.push_back(edge()); 
} 

Точная ошибка:

Утверждение не выполнено: (reinterpret_cast (array) & 0xf) == 0 & & "здесь описано это утверждение:" "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalign edArrayAssert.html" "**** ПРОЧИТАЙТЕ ЭТУ WEB-СТРАНИЦУ !!! ****», файл \ ла \ л \ ла \ включает \ собственного \ о собственном Эйгене-dc6cfdf9bcec \ Эйгена \ SRC \ ядро ​​\ densestorage.h, строка 86

Я пошел на веб-страницу и читать что мне нужно, чтобы добавить этот макрос: EIGEN_MAKE_ALIGNED_OPERATOR_NEW, которые я добавил в структуры следующим образом:.

struct edge{ 
     unsigned int a; 
     unsigned int b; 
     Eigen::Matrix<double, 2, 1> slope; 
     double mag; 
     Eigen::Matrix<double, 2, 1> normal; 
     std::vector<unsigned int> list; 

     EIGEN_MAKE_ALIGNED_OPERATOR_NEW 
    }; 

Но ошибка продолжает это происходит с VS 2013 и с Эйгеном версии 3.2.9 и тот же код неизмененные работы. отлично с версией 3.2.0. В Linux с GCC версии 5.3 он отлично работает с бета-сборкой Eigen. Что я делаю неправильно с этой более новой версией, чтобы вызвать эту проблему?

ответ

3

У вас есть std::vector, который содержит фиксированные типы Eigen, которые должны быть выровнены. Номер выпуска: std::vector<edge> телефон: edge содержит фиксированный размер Eigen::Matrix<double, 2, 1>. Здесь EIGEN_MAKE_ALIGNED_OPERATOR_NEW не достаточно, то дополнительно нужно выбрать выровненных распределители Эйгена, как описано в https://eigen.tuxfamily.org/dox/group__TopicStlContainers.html

Использование STL контейнеров на фиксированном размер распараллеливаемых типов Эйгена или классах> имеющими член таких типов, требует принятия следующих два этапа: (i) Должен использоваться 16-байтовый распределитель. Eigen предоставляет один готовый к использованию: aligned_allocator. (ii) Если вы хотите использовать контейнер std :: vector , вам необходимо #include <Eigen/StdVector>.

Вы должны исправить свой код примерно так (не проверено):

#include<Eigen/StdVector> 
class Foo { 
    ... 
    std::vector<edge,Eigen::aligned_allocator<edge> > edges; 
} 

Внимание: В Linux вы просто повезло, он работал (возможно потому, что 32bit/64bit), ваш код должен действительно быть исправлены ,

+0

В чем разница между 'Eigen :: aligned_allocator ' и 'Eigen :: aligned_allocator >' для этого примера? Причина, по которой я спрашиваю, - это код для производства без ошибок. – Matt

+0

Использование распределителя, сделанного для другого типа, звучит как что-либо * может произойти во время выполнения, я буду осторожен. – SpamBot

 Смежные вопросы

  • Нет связанных вопросов^_^