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.
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'? –