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

Langage C++ Discussion :

Problème pour créer un tableau de pointeurs de fonction


Sujet :

Langage C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut Problème pour créer un tableau de pointeurs de fonction
    Bonjour.
    Je suis face à un problème. Pour optimiser un bout de code, j'aimerais créer un tableau de pointeurs de fonction. Mais le problème est que les fonctions à mettre dedans n'ont pas le même nombre de paramètres.
    J'ai deux fonctions qui n'ont aucun paramètre, et 3 autres qui ont un paramètre, dont on connait la valeur lors de la création du tableau.
    Les 5 fonctions ne renvoient rien.

    Y aurait-il un moyen de mettre toutes ces fonctions dans un même tableau ?
    Merci d'avance.


    PS : j'aimerais si possible avoir à ne pas utiliser d'autres bibliothèques que la bibliothèque standard.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Sur cette page, tu trouveras dans les commentaires de l'article une solution avec Boost.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,

    L'idée est d'utiliser d'offrir la même signature en ayant lié les arguments connus à la construction. Il est clair que les solutions les plus simples sont avec Boost.Bind et Boost.Function en C++99 et leur équivalent std::bind, std::function avec C++11 ou avec tr1 :
    Code C++11 : 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
    #include <iostream>
    #include <string>
     
    void f1()
    {
        std::cout<<"f1\n";
    }
     
    void f2()
    {
        std::cout<<"f2\n";
    }
    void f3()
    {
        std::cout<<"f3\n";
    }
    void f4(int i_)
    {
        std::cout<<"f4("<<i_<<")\n";
    }
     
    void f5(std::string str_)
    {
        std::cout<<"f5("<<str_<<")\n";
    }
     
    #include <functional>
    #include <vector>
     
    #include <algorithm>
     
    int main()
    {
       typedef std::function<void ()> fonction_type;
     
       std::vector<fonction_type> mes_fonctions={f1,f2,f3,std::bind(f4,1),std::bind(f5,"coucou")};
     
       std::for_each(mes_fonctions.begin(),mes_fonctions.end(),[](fonction_type f_){f_();});
     
     
       return 0;
    }

    Sinon, une solution C++98 est de s'appuyer sur le type erasure.

    Mais pourquoi penses-tu qu'un tableau de fonctions va optimiser ton code ? Surtout sur 5 fonctions à appeler ??? Peux tu montrer ce bout de code que tu veux optimiser ? Peut être, s'il y a vraiment lieu à optimiser, faut-il attaquer sous un autre angle ?

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Merci pour vos réponses.

    Je parlais d'optimisation par rapport à la taille du code.
    Voici ce fameux code :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    void Guerrier::faireJouerJoueur(Personnage& adversaire)
    {
    	std::string choix;
    	bool choixCorrect = false;
     
    	if (m_toursAvantRepos != 0)
    		m_toursAvantRepos -= 1;
     
    	while ((choix != "1" && choix != "2" && choix != "3" && choix != "4" && choix != "5") || !choixCorrect)
    	{
    		afficherJauges();
    		std::cout << std::endl << std::endl;
    		adversaire.afficherJauges();
    		std::cout << std::endl << std::endl << std::endl;
     
    		std::cout << "1. Coup de poing\t-10 a -14 F <> Adversaire : 8 a -12 V" << std::endl;
    		std::cout << "2. Coup d'epee\t\t-15 a -21 F <> Adversaire : -13 a -17 V" << std::endl;
    		std::cout << "3. Coup de hache\t-20 a -28 F <> Adversaire : -18 a -22 V" << std::endl;
    		std::cout << "4. Chasser\t\t+15 a +20 V / -17 a -22 F" << std::endl;
    		std::cout << "5. Repos\t\t+3 a +7 V / +10 a +14 F" << std::endl << std::endl;
     
    		std::cout << m_nom << ", choisissez une action : ";
    		std::cin >> choix;
     
    		if (choix == "1")
    		{
    			if (m_force >= 14)
    			{
    				coupPoing(adversaire);
    				choixCorrect = true;
    			}
     
    			else
    				std::cout << "/!\\ Vous ne disposez d'au moins 14 points de force. /!\\" << std::endl << std::endl << std::endl;
    		}
     
    		else if (choix == "2")
    		{
    			if (m_force >= 21)
    			{
    				coupEpee(adversaire);
    				choixCorrect = true;
    			}
     
    			else
    				std::cout << "/!\\ Vous ne disposez d'au moins 21 points de force. /!\\" << std::endl << std::endl << std::endl;
    		}
     
    		else if (choix == "3")
    		{
    			if (m_force >= 28)
    			{
    				coupHache(adversaire);
    				choixCorrect = true;
    			}
     
    			else
    				std::cout << "/!\\ Vous ne disposez d'au moins 28 points de force. /!\\" << std::endl << std::endl << std::endl;
    		}
     
    		else if (choix == "4")
    		{
    			if (m_force >= 22)
    			{
    				chasser();
    				choixCorrect = true;
    			}
     
    			else
    				std::cout << "/!\\ Vous ne disposez d'au moins 22 points de force. /!\\" << std::endl << std::endl << std::endl;
    		}
     
    		else if (choix == "5")
    		{
    			if (m_toursAvantRepos == 0 || (m_toursAvantRepos != 0 && m_force < 14))
    			{
    				repos();
    				choixCorrect = true;
    			}
     
    			else
    				std::cout << "/!\\ Vous ne pourrez vous reposer que dans " << m_toursAvantRepos << " tour(s). /!\\" << std::endl << std::endl << std::endl;
    		}
     
    		else
    			std::cout << "/!\\ Ce choix n'existe pas. /!\\" << std::endl << std::endl << std::endl;
    	}
    }
    Comme on peut le voir, les différents if se ressemblent. J'ai donc pensé à les remplacer, de la ligne 25 à 82, par une boucle for.
    Pour faire cette boucle, il me faut un tableau ou stocker le résultat des tests (m_force >= 14, m_force >= 21, ...), un pour les fonctions à exécuter (coupPoing, coupEpee, coupHache, chasser, repos) et un pour les messages d'erreur.

    La méthode avec les std::function et std::bind était ce qu'il me falait. Cependant, sachant que je travaille dans une classe, et que les fonctions sont des méthodes de classe, j'ai eu quelques erreurs en mettant le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef std::function<void ()> fonction;
    fonction fonctionActions[] = {std::bind(coupPoing, adversaire), std::bind(coupEpee, adversaire), std::bind(coupHache, adversaire), chasser, repos};
    Classes/Guerrier.cpp: In member function 'virtual void Guerrier::faireJouerJoueur(Personnage&)':
    Classes/Guerrier.cpp:52:63: error: argument of type 'void (Personnage::)(Personnage&)' does not match 'void (Personnage::*)(Personnage&)'
    Classes/Guerrier.cpp:52:96: error: argument of type 'void (Guerrier::)(Personnage&)' does not match 'void (Guerrier::*)(Personnage&)'
    Classes/Guerrier.cpp:52:130: error: argument of type 'void (Guerrier::)(Personnage&)' does not match 'void (Guerrier::*)(Personnage&)'
    Pour vous aider voici le diagramme de classe de mon programme :
    http://img11.hostingpics.net/pics/21...edeclasses.png

Discussions similaires

  1. Problème pour créer une clé étrangère
    Par DevloNewb' dans le forum Requêtes
    Réponses: 5
    Dernier message: 01/07/2006, 16h30
  2. [Tableaux] Problème pour contrôler un tableau
    Par renaud26 dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2006, 11h45
  3. Problème pour créer la relation
    Par LeNeutrino dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/02/2006, 13h24
  4. [XML word] problème pour créer des puces
    Par ratapapa dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 21/07/2005, 13h52

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