2009-04-21 5 views
1

J'ai une enveloppe simple pour un générateur de nombres aléatoires Mersenne. Le but est de mettre à l'échelle le nombre renvoyé par le générateur (entre 0 et 1) entre les limites définies par l'argument (début et fin).Comportement en ligne déroutant du générateur de nombres aléatoires (C++)

donc ma fonction est

inline float xlRandomFloat(float begin, float end) {return (begin+((end-begin)*genrand_real2()));} 

Je ne crois pas que la mise en œuvre de la fonction genrand_real2() est important, mais si je me trompe, il peut être trouvé here

Le problème est que la fonction fait ne retourne pas le résultat traduit. La mise à l'échelle (multiplier par (début-fin) semble fonctionner correctement, mais l'addition de begin ne semble pas être retournée.)

Donc, si j'appelle xlRandomFloat (5,10) - j'obtiens des valeurs entre 0 et 5.

Si je débogage avec GDB, et utiliser la fonction d'impression puis il montre le résultat correct. donc j'essayé séparer les choses en lignes pour voir ce qui se passe

inline float xlRandomFloat(float begin, float end) { 
    float ret; 
    ret=(((end-begin)*genrand_real2())); 
    ret+=begin; 
    return ret;}; 

Lorsque le débogage, il a sauté directement de la première ligne dans la fonction genrand_real2() et a sauté tout le reste entièrement.C'était vraiment déroutant alors je pensais que avoir quelque chose à voir avec l'inline. J'ai déplacé le fichier de ce fichier .hpp vers le fichier .cpp et j'ai supprimé le mot-clé inline et tout fonctionne correctement.

Mais pourquoi ce comportement se produit-il, et comment puis-je intégrer cette fonction? De plus, je ne sais pas si cela est pertinent, mais souvent, lorsque j'apportais des changements aux sources, ma compilation Make disait qu'il n'y avait rien à faire. Ce qui est inhabituel puisque normalement je m'attends à faire des changements dans les sources et à reconstruire en conséquence.

Des idées.

Merci

Zenna

Répondre

1

Bon, plusieurs choses à l'œuvre ici. Tout d'abord, lors du débogage, vous décrivez ce que j'appellerais le comportement plus ou moins attendu, car lorsque vous insérez une fonction, il n'y a pas de code généré pour la fonction fromt de la fonction. Ainsi, la première déclaration il y a

ret=(((end-begin)*genrand_real2())); 

et la première étape est d'appeler genrand_real2(). Si genrand_real2() est également en ligne, alors vous vous retrouvez à la première déclaration en cela, sans pause pour reprendre votre souffle.Deuxièmement, assurez-vous que vous utilisez vraiment le code que vous pensez être. Essayez de créer à partir d'un répertoire propre - certains compilateurs C++ font des pièces précompilées qu'ils conservent pour accélérer la compilation. Assurez-vous que votre définition en ligne a été complètement supprimée ou commentée des fichiers d'en-tête. Par exemple, créez un programme très simple avec une ligne et assurez-vous qu'il se comporte comme prévu.

1

Votre code est parfaitement bien, il doit y avoir quelque chose de mal avec la façon dont vous la compilation. Assurez-vous que votre Makefile a les dépendances appropriées: les fichiers sources doivent dépendre des fichiers d'en-tête qu'ils incluent. Le suivi de ces dépendances est rarement fait à la main, généralement pour de très petits projets - ils sont normalement générés par un outil tel que makedepend.

Pour voir si le problème est dû à Inline, désactivez simplement toutes les optimisations en utilisant l'option -O0 (dash capital-oh zero) avec GCC. Assurez-vous également d'activer les symboles de débogage avec -g.

+0

Merci beaucoup Vous avez raison. Je l'ai construit avec des blocs de code et cela fonctionne correctement. À l'heure actuelle, j'ai la structure suivante: tous: $ (SOURCES) $ (EXÉCUTABLE) $ (EXECUTABLES): $ (objets) $ (CC) $ (LDFLAGS) $ (objets) -o $ @ $ (CC) $ (CFLAGS) $ <-o $ @ Comme vous l'avez dit, j'essaierai d'inclure la dépendance de l'en-tête, mais je pensais que les dépendances devaient pousser NIRG à recompiler en raison de un en-tête en cours de modification, si je reconstruis tout à partir de rien cependant, comment cela pourrait-il faire la différence? – zenna

Questions connexes