2010-12-04 6 views
2

je la fonction suivante, qui génère un nombre entier dans une plage donnée:pointeurs de lecture aléatoire et la fonction aléatoire

18 int choosecard(){ 
19  boost::uniform_int<> dist(0,51); 
20  boost::variate_generator< boost::mt19937&, boost::uniform_int<> > cardchoice(gen, dist); 
21  return cardchoice(); 
22 } 

Je veux l'utiliser comme un argument à std :: random_shuffle, afin que je puisse mélanger un vecteur de 52 entiers.

64  int (*pchoosecard)(void) = choosecard; 
65 
66  std::random_shuffle(cards.begin(), cards.end(), pchoosecard); 

Cependant je reçois cette erreur que je ne comprends pas:

$ make 
g++ -I /usr/local/boost_1_45_0/ -c main.cpp 
In file included from /usr/include/c++/4.4/algorithm:62, 
       from /usr/local/boost_1_45_0/boost/any.hpp:13, 
       from /usr/local/boost_1_45_0/boost/program_options/value_semantic.hpp:12, 
       from /usr/local/boost_1_45_0/boost/program_options/options_description.hpp:13, 
       from /usr/local/boost_1_45_0/boost/program_options.hpp:15, 
       from main.cpp:1: 
/usr/include/c++/4.4/bits/stl_algo.h: In function ‘void std::random_shuffle(_RAIter, _RAIter, _Generator&) [with _RAIter = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, _Generator = int (*)()]’: 
main.cpp:66: instantiated from here 
/usr/include/c++/4.4/bits/stl_algo.h:4998: error: too many arguments to function 
make: *** [main.o] Error 1 

Tout compile bien quand je commente la ligne qui appelle std :: random_shuffle.

Quelqu'un peut-il faire la lumière sur ce problème?

Répondre

1

Il y a "trop ​​d'arguments" car std::random_shuffle essaie de passer trop d'arguments au rappel que vous lui avez donné. Donc, c'est vraiment trop quelques paramètres.

Votre choosecard est supposé accepter un paramètre, de type ptrdiff_t, qui indique à la fonction le nombre d'éléments, fondamentalement. (Vous n'êtes pas censé coder en dur le nombre de cartes dans cette fonction.) Donc, vous branchez cela au constructeur boost::uniform_dist.

+0

Merci, mais je suis encore assez confus. Je n'ai pas de constructeur uniform_dist. Voulez-vous dire la ligne avec boost :: uniform_int <> dist (0,51)? J'ai fait choosecard prendre un ptrdiff_t, je. Et puis changé la ligne ci-dessus à boost :: uniform_int <> dist (0, i-1); Cependant, je reçois juste plus de bogues cryptiques – oadams

+0

nevermind, problème résolu. – oadams

1

De http://www.cplusplus.com/reference/algorithm/random_shuffle/:

template <class RandomAccessIterator, class RandomNumberGenerator> 
void random_shuffle (RandomAccessIterator first, RandomAccessIterator last, 
         RandomNumberGenerator& rand); 

première, dernière

terme itérateurs aux initiales et finales des positions de la séquence à être mélangées. La plage utilisée est [premier, dernier), qui contient tous les éléments entre le premier et le dernier, y compris l'élément pointé par le premier mais pas l'élément pointé par le dernier.

rand

pointeur de fonction unaire prenant un argument et renvoyant une valeur, tous deux du type approprié différence (généralement ptrdiff_t). La fonction doit renvoyer une valeur comprise entre zéro et son argument (inférieur à this).