2011-03-24 4 views
0

J'ai eu un problème relativement sérieux avec boost :: random. Contexte: J'utilise TDM-GCC x64 sous Windows 7 x64. Options du compilateur sont -g -Wall -fexceptions Je construis Boost en utilisant le même compilateur ambience, mais cela ne devrait pas question lors de l'utilisation aléatoire car il est en-tête neCrashes lors de l'utilisation boost :: random

Alors maintenant mon problème (?): Je suis arrivé ce fonction:

#define PRNG_GENERATOR boost::mt19937 

COORD function_g(int depth) 
    { 
     double _range; 
     _range = 1/(depth + 1.0f); 

     boost::uniform_real<double> range(-_range, _range); 

     boost::variate_generator<PRNG_GENERATOR&, boost::uniform_real<double> > v_png(*this->m_prng, range); 

     return v_png(); 
    } 

Quand j'appelle cette fonction de mon programme se bloque avec une erreur c0000026 dans le module ntdll.dll. Le plantage est toujours affiché par gdb sur la première ligne de l'opérateur() du moteur de nombre aléatoire de boost (dans ce cas, il est dans le fichier mersenne_twiseter.hpp à la ligne 319 qui est "if (i == n) "- pas réellement quelque chose que je m'attendrais à provoquer un accident). Et la chose la plus étrange est que ce crash est apparu - je n'ai pas modifié de code, juste une recompilation (propre) et chaque build après le premier affichage du crash se bloque juste ...!?

Je passe maintenant à environ une heure de recherche Internet pour cette mystérieuse erreur c0000026, mais n'a rien trouvé valueable ....

Quelqu'un a une astuce comment résoudre ce problème?

Répondre

1

Vous ne nous avez pas montré comment this->m_prng est initialisé. Etes-vous sûr qu'il pointe vers un objet valide de type boost::mt19937? Le reste semble correct, autant que je sache.

+0

Ah merci pour le pointeur, voici ist: this-> m_prng = nouveau PRNG_GENERATOR (this-> m_ec.map_randseed); Cependant, this-> m_prng est seulement utilisé dans la fonction ci-dessus et le morceau ici montré du constructeur de la classe ... actuellement j'utilise srand + rand pour tester, mais ils ne sont pas satisfaisants en termes de distribution uniforme et "aléatoire" – dom0

+0

@csde: Êtes-vous absolument certain que 'PRNG_GENERATOR' est' # define'-ed identiquement dans chaque unité de traduction? Un 'typedef' à la portée de la classe serait plus dans l'esprit de C++, et permet au compilateur de faire plus de vérification de type. –

+0

@csde: Une autre suggestion que je ferais est de dépouiller votre code à un strict minimum, un exemple compilable et autonome qui reproduit le crash que vous voyez. Il y a de bonnes chances que vous trouviez le problème vous-même en faisant cet exercice. Sinon, au moins vous aurez un petit exemple autonome que vous pouvez poster ici. Il est difficile de dire ce qui pourrait mal se passer, sans voir tout le code impliqué. –

Questions connexes