2017-07-04 1 views
-1

J'ai reçu une erreur de violation d'accès lorsque j'attribue un quaterninon. J'ai vérifié que i n'est pas hors bounds.The code est le coup:Affectation du quaternion Échec de l'état Eigen

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 
} 
}; 

L'appel est de retour comme ci-dessous:

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] 

Cette erreur happends par mégarde. Parfois, cela ne se produit pas. Je ne sais pas si cela a à voir avec l'alligmentation.
J'utilise Visual Studion 2013, Eigen 3.3.4 sur Windows 10.

+0

Qu'est-ce que m_lastQ? S'il s'agit d'un conteneur STL, avez-vous essayé d'utiliser '.at (i)' au lieu de '[i]' pour déterminer si un accès hors-limite se produit? Si c'est un pointeur, êtes-vous sûr que la mémoire allouée est suffisamment grande pour que l'élément 'i'th lui appartienne toujours? D'où vient le quaternion 'pos'? –

Répondre

0

C'est le problème avec le conteneur STL. Here est l'explication.

Pour utiliser std :: vector avec Eigen, un allocateur aligné est nécessaire.

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