四元数赋值在特征中失败

时间:2017-07-04 08:35:36

标签: c++ eigen

我在分配季度时遇到了访问冲突错误。我已经检查过i没有超出范围。代码就是打击:

using Quaternionr = Eigen::Quaternion<double>;
class A{
      std::vector<Quaternionr> m_lastQ;
public:
      EIGEN_MAKE_ALIGNED_OPERATOR_NEW
inline void setLastQuaternion(const unsigned int i, const Quaternionr &pos)
 {
      m_lastQ[i] = pos; // access violation happends
 }
 };

回拨如下:

POCosseratRods.exe!Eigen::internal::pload<__m128d>(const double * from) Line 307    
POCosseratRods.exe!Eigen::internal::ploadt<__m128d,16>(const double * from) Line 463    
POCosseratRods.exe!Eigen::internal::evaluator<Eigen::PlainObjectBase<Eigen::Matrix<double,4,1,0,4,1> > >::packet<16,__m128d>(int row, int col) Line 197 
POCosseratRods.exe!Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::assign_op<double,double>,0>::assignPacket<16,16,__m128d>(int row, int col) Line 652  
POCosseratRods.exe!Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::assign_op<double,double>,0>::assignPacketByOuterInner<16,16,__m128d>(int outer, int inner) Line 667  
POCosseratRods.exe!Eigen::internal::copy_using_evaluator_innervec_CompleteUnrolling<Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::assign_op<double,double>,0>,0,4>::run(Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::assign_op<double,double>,0> & kernel) Line 276    
POCosseratRods.exe!Eigen::internal::dense_assignment_loop<Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::assign_op<double,double>,0>,2,2>::run(Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::assign_op<double,double>,0> & kernel) Line 468  
POCosseratRods.exe!Eigen::internal::call_dense_assignment_loop<Eigen::Matrix<double,4,1,0,4,1>,Eigen::Matrix<double,4,1,0,4,1>,Eigen::internal::assign_op<double,double> >(Eigen::Matrix<double,4,1,0,4,1> & dst, const Eigen::Matrix<double,4,1,0,4,1> & src, const Eigen::internal::assign_op<double,double> & func) Line 741 
POCosseratRods.exe!Eigen::internal::Assignment<Eigen::Matrix<double,4,1,0,4,1>,Eigen::Matrix<double,4,1,0,4,1>,Eigen::internal::assign_op<double,double>,Eigen::internal::Dense2Dense,void>::run(Eigen::Matrix<double,4,1,0,4,1> & dst, const Eigen::Matrix<double,4,1,0,4,1> & src, const Eigen::internal::assign_op<double,double> & func) Line 879   
POCosseratRods.exe!Eigen::internal::call_assignment_no_alias<Eigen::Matrix<double,4,1,0,4,1>,Eigen::Matrix<double,4,1,0,4,1>,Eigen::internal::assign_op<double,double> >(Eigen::Matrix<double,4,1,0,4,1> & dst, const Eigen::Matrix<double,4,1,0,4,1> & src, const Eigen::internal::assign_op<double,double> & func) Line 836   
POCosseratRods.exe!Eigen::internal::call_assignment<Eigen::Matrix<double,4,1,0,4,1>,Eigen::Matrix<double,4,1,0,4,1>,Eigen::internal::assign_op<double,double> >(Eigen::Matrix<double,4,1,0,4,1> & dst, const Eigen::Matrix<double,4,1,0,4,1> & src, const Eigen::internal::assign_op<double,double> & func, void * __formal) Line 804   
POCosseratRods.exe!Eigen::internal::call_assignment<Eigen::Matrix<double,4,1,0,4,1>,Eigen::Matrix<double,4,1,0,4,1> >(Eigen::Matrix<double,4,1,0,4,1> & dst, const Eigen::Matrix<double,4,1,0,4,1> & src) Line 782  
POCosseratRods.exe!Eigen::PlainObjectBase<Eigen::Matrix<double,4,1,0,4,1> >::_set<Eigen::Matrix<double,4,1,0,4,1> >(const Eigen::DenseBase<Eigen::Matrix<double,4,1,0,4,1> > & other) Line 710  
POCosseratRods.exe!Eigen::Matrix<double,4,1,0,4,1>::operator=(const Eigen::Matrix<double,4,1,0,4,1> & other) Line 209   
POCosseratRods.exe!Eigen::QuaternionBase<Eigen::Quaternion<double,0> >::operator=(const Eigen::QuaternionBase<Eigen::Quaternion<double,0> > & other) Line 486   
POCosseratRods.exe!OrientationData::setLastQuaternion(const unsigned int i, const Eigen::Quaternion<double,0> & pos) Line 407   
POCosseratRods.exe!TimeStepController::step(SimulationModel & model) Line 43    
POCosseratRods.exe!RodScene::update() Line 117  
POCosseratRods.exe!idlefunc() Line 40   
freeglutd.dll!0fd8dd9c()    Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for freeglutd.dll] 
POCosseratRods.exe!main(int argc, char * * argv) Line 90    
[External Code] 

此错误意外发生。有时,它不会发生。我不知道它是否与alligenment有关 我在Windows 10上使用Visual Studion 2013,Eigen 3.3.4。

1 个答案:

答案 0 :(得分:0)

这是STL容器的问题。 Here是解释。

要将std :: vector与Eigen一起使用,必须使用对齐的分配器。

std::vector<Quaternionr,Eigen::aligned_allocator<Quaternionr>> m_lastQ;