IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

Intégration de la librairie de Boost (Erreur de compilation) ;)


Sujet :

Boost C++

  1. #1
    Membre actif
    Homme Profil pro
    Chef de produit
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chef de produit

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 246
    Points
    246
    Par défaut Intégration de la librairie de Boost (Erreur de compilation) ;)
    Bonjour à tous,
    je voulais utiliser un header de l'ensemble des librairies de Boost
    "boost/random/triangle_distribution.hpp"

    j'ai trouvé un exemple sur http://miles.developpez.com/tutoriels/cpp/boost/random/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void test()
    {
        boost::mt19937 engine(static_cast<long unsigned int>(clock()));
        boost::normal_distribution<double> generator;
        boost::variate_generator<boost::mt19937, boost::normal_distribution<double> > binded(engine, generator);
    }
    moi je le veut pour triangle_distribution alors ça donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void test()
    {
        boost::mt19937 engine(static_cast<long unsigned int>(clock()));
        boost::triangle_distribution<double> generator;
        boost::variate_generator<boost::mt19937, boost::triangle_distribution<double> > binded(engine, generator);
    }
    MAis normalement la fonction triangulaire demande 3 variables: 2 pour l'intervalle et une comme valeur nominale.

    Mon code général c'est ça, en gros je veux utiliser cette librairie pour générer des valeurs selon la méthode triangulaire et les stocker sur un fichier txt
    Ma question est ce code de void test() suffit, il est ce qu'il va me sortir une valeur. (Débutant en C++)
    et comment faire pour intégrer les variables de la fonction triangulaire
    MERCI


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include <stdio.h>
    #include <stdlib.h>
    #include <fstream>
    #include <boost/random/triangle_distribution.hpp>
    #include <boost/random/variate_generator.hpp>
    #include <boost/random/mersenne_twister.hpp>
    #include <ctime>
     
    void test()
    {
        boost::mt19937 engine(static_cast<long unsigned int>(clock()));
        boost::triangle_distribution<double> generator;
        boost::variate_generator<boost::mt19937, boost::triangle_distribution<double> > binded(engine, generator);
    }
     
    //Méthode pour ajouter une ligne dans un fichier .txt
    void AjouterUneLigne()
    {
        int random_integer=test();
     
        // std::ios_base::out est automatiquement ajouté par le constructeur de std::ofstream
        std::ofstream file( "fichier.txt", std::ios_base::app );
        file << random_integer<<"\n";
    }
     
     
    int main()
    {
     
    long compteur = 0;
     
      while (compteur < 17)
    {
        AjouterUneLigne();
        compteur++;
    }
      return 0;
    }
    PS: je travaille avec code::blocks

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Points : 108
    Points
    108
    Par défaut
    Quelques remarques dans un premier temps:

    Tu fais un appel à ta fonction test dans ta ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int random_integer=test();
    or ta fonction test ne fait rien et retourne le type void. Il faudrait que cette fonction fasse un calcul aléatoire et renvoie ce nombre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double test()
    {
    	boost::mt19937 engine(static_cast<long unsigned int>(clock()));
    	boost::triangle_distribution<double> generator;
    	boost::variate_generator<boost::mt19937, boost::triangle_distribution<double> > binded(engine, generator);
    	return binded();
    }
    (Au passage, le nombre est un double et pas un int...)

    Dans cette fonction, la variable binded est un foncteur. Il faut l'appeler avec l'opérateur parenthèses pour obtenir un résultat.

    La fonction AjouterUneLigne devrait dont être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void AjouterUneLigne()
    {
    	double random_double = test();
     
        // std::ios_base::out est automatiquement ajouté par le constructeur de std::ofstream
    	std::ofstream file( "fichier.txt", std::ios_base::app );
    	file << random_double << "\n";
    }
    Restera un problème: l'initiation de la séquence aléatoire pour qu'elle ne sorte pas toujours les mêmes nombres, à l'aide d'une graine (seed en anglais), par exemple basée sur l'heure. Dans ton exemple, tu crée un nouveau générateur de nombre aléatoire (binded) à chaque appel de la fonction test. Il faudrait donc l'initialiser avec seed à chaque appel également. Ce n'est pas très efficace (voire même cela aura un mauvais comportement). Il vaudrait mieux que tu crées le générateur dans ta fonction main juste avant ta boucle, que tu l'initialises avec seed, et que tu l'utilises dans la boucle. Ou encore mieux, encapsuler ton générateur dans une classe qui sera aussi chargée de générer ton fichier.

    Je te renvoie au tuto sur Boost.Random. Mais n'hésite pas demander plus d'infos.

    Nico

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Points : 108
    Points
    108
    Par défaut
    Ça pourrait ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <fstream>
    #include <boost/random/triangle_distribution.hpp>
    #include <boost/random/variate_generator.hpp>
    #include <boost/random/mersenne_twister.hpp>
    #include <ctime>
     
    /*
     * Une classe pour encapsuler les éléments de Boost.Random.
     * Elle-même un foncteur.
     */
    class TriangleRandomGenerator
    {
    public:
        // Le constructeur prend les trois valeurs dont tu parles: a (borne basse),
        // c (borne haute) et b (valeur la plus probable).
        TriangleRandomGenerator(double a, double b, double c);
     
        // Ici on fabrique un foncteur, mais on pourrait aussi bien avoir une méthode
        // comme "double next_number();" qui ferait le même effet
        double operator()();
     
    private:
        boost::mt19937 engine;
        boost::triangle_distribution<double> generator;
        boost::variate_generator<boost::mt19937& ,boost::triangle_distribution<double> > binded;
    };
     
    TriangleRandomGenerator::TriangleRandomGenerator(double a, double b, double c)
            : engine(static_cast<long unsigned int>(time(0)) // Initialise le moteur en fonction de l'heure
            , generator(a, b, c) // Initialise la distribution triangulaire
            , binded(engine, generator) // Lie les deux précédents
    {
    }
     
    double TriangleRandomGenerator::operator()()
    {
        return binded();
    }
     
     
    int main()
    {
        TriangleRandomGenerator gen(10.0, 15.0, 20.0);
        std::ofstream file("fichier.txt", std::ios_base::app);
        for (int i = 0; i < 17; ++i)
        {
            file << gen() << "\n"; // ou file << gen.next_number() << "\n"
        }
        file.flush();  // ;-)
        return 0;
    }

  4. #4
    Membre actif
    Homme Profil pro
    Chef de produit
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chef de produit

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 246
    Points
    246
    Par défaut
    déjà Merci pour tes réponses.

    alors j'ai compilé le code de que t'a proposé mais ça donne des erreurs au niveau de cette partie :
    Est ce quelqu'un aura une explication. Merci
    PS: pour voir le code en entier, regarder ci dessus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TriangleRandomGenerator::TriangleRandomGenerator(double a, double b, double c)
    : engine(static_cast<long unsigned int>(time(0))
    , generator(a, b, c)
    , binded(engine, generator)
    {
    }
    Message d'erreur:
    no match for call to '(boost::triangle_distribution <double>) (double&, double&, double&)'

    no match for call to '(boost::variate_generator<boost::mt19937& ,boost::triangle_distribution<double> > ) boost::mt19937& ,boost::triangle_distribution<double>&)'

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Points : 108
    Points
    108
    Par défaut
    Oups, j'ai écrasé une parenthèse en ajoutant le commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TriangleRandomGenerator::TriangleRandomGenerator(double a, double b, double c)
        : engine(static_cast<long unsigned int>(time(0)))
        , generator(a, b, c)
        , binded(engine, generator)
    {
    }
    Ça devrait aller mieux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/10/2007, 09h06
  2. [Web Service][SOAP] Librairie Nusoap - Message erreur
    Par squalito dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 01/02/2007, 11h21
  3. Erreur de compilation de boost::date_time avec mingw
    Par shenron666 dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 26/08/2006, 18h18
  4. Erreur de compilation sur une librairie en mode debug
    Par bakaneko dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/05/2006, 16h32
  5. [BOOST] erreur interne du compilateur
    Par venomelektro dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 15/04/2006, 18h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo