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

C++Builder Discussion :

Passage de méthode en paramètre d'une autre méthode [FAQ]


Sujet :

C++Builder

  1. #1
    say
    say est déconnecté
    Membre éprouvé
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 258
    Points
    1 258
    Par défaut Passage de méthode en paramètre d'une autre méthode
    hello...
    Je cherche à faire le même type de manip qu'ici
    http://www.developpez.net/forums/showthread.php?t=59461
    mais je m'en sors pas avec ce bout d'exemple.

    Quelqu'un peut-il m'orienter?


    merci d'avance

  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    En fait je ne vois pas en quoi le code donnée dans le topic que tu donne en lien envoie une fonction en paramètre.
    Citation Envoyé par Freeze
    Comment peut on passer une fonction en paramètre, je m'explique, je voudrais pouvoir faire appel à une fonction en passant une fonction dans les paramètres
    Citation Envoyé par say
    Je cherche à faire le même type de manip qu'ici
    Je sais que c'est possible à faire, mais je ne me souvient plus trop comment, je cherche et je te dit quoi.
    A plus

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Salut.
    Il y a un moment je m'étais servi des pointeurs sur fonctions sous BCB pour un truc précis, que je vais tenter d'expliquer le plus clairement.
    J'avais un bot irc, et je voulais qu'en fonction d'une commande tapée, ça appelle la fonction appropriée.
    Bien sûr la solution facile aurait été au moment de la récupération du nom de la commande de faire un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (StrCommande == "cmd1")
       FctCommande1();
    else if (StrCommande == "cmd2")
       FctCommande2();
    .....
    Seulement, le défaut de cette méthode est que, si le nombre de fonctions potentielle augmente, avec l'enchainement des if / else if, la lisibilité c'est plus trop ça. Et puis surtout, c'est tellement moins drôle :] La solution: les pointeurs sur fonction.
    L'idée: On crée une structure "SHash" qui contient le nom de la commande, et un pointeur sur fonction (la fonction à exécuter)
    On initialise au début du programme une liste de pointeurs qui contiendra tous nos objets "SHash".
    Ensuite, quand on parse la string reçue, ne nous reste plus qu'à parcourir notre liste à la recherche de la commande appropriée.
    Concrètement:

    Dans mon point h :

    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
     
    TList* LstFctsBot;
     
    typedef void (__closure *ptrCmdBot)(void); //définition du type de mon pointeur sur les fonctions du bot
     
    struct SHach //Clé de "hach" qui contient les pointeurs sur fonctions des commandes du bot
    {
           ptrCmdBot ptr;
           AnsiString id;
     
           SHach (ptrCmdBot p, AnsiString i)
           {
                 ptr = p;
                 id  = i;
           }
    };
    Ensuite, dans le point cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    LstFctsBot  = new TList;
    LstFctsBot->Add (new SHach (&time,"time"));
    LstFctsBot->Add (new SHach (&stat,"stat"));
    LstFctsBot->Add (new SHach (&kick,"kick"));
    ...
    Et au moment où on parse:

    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
     
    void CBot::_Parser (const AnsiString StrCmd) throw ()
    {
          //Le code qui suit c'est à l'arrache :]
          SHach* Cle;
          bool bTrouve = false;
          for (int i=0; i< LstFctsBot->Count && !bTrouve; ++i)
          {
                 Cle = (SHach*) LstFctsBot->Items[i];
                 if (Cle->id == StrCmd)
                 {
                       Cle->ptr(); //Appel à notre fonction !
                       bTrouve = true;
                 }
          }
    }
    Passons l'implémentation des fonctions en question hein... Et qui, dans cet exemple, doivent porter le même nom que leur identifiant pour que ça fonctionne bien évidemment.
    Voilà voilà, cet exemple n'a que peu d'intéret en pratique à dire vrai, c'était plus pour la forme que pour le fond :]
    J'espère que ça t'a pas embrouillé plus qu'autre chose. Dans ton cas en fait, le truc juste important à retenir, c'est comment déclarer un prototype de pointeur sur fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef void (__closure *ptrSurMaFontion)(void);

  4. #4
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Je trouve l'expliquation très bonne, je n'aurrai jamais fait mieux, (je suis une quiche en expliquation )

  5. #5
    say
    say est déconnecté
    Membre éprouvé
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 258
    Points
    1 258
    Par défaut
    Merci beaucoup beaucoup à Runlevel pour son explication, c'est parfait.
    c'est clair...et en plus ça marche

    bonne continuation à tous

    Simon

    Edited : à mettre en FAQ maybe?

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Si BCB supporte, boost.function, boost.bind et boost.signal sont des moyens de réaliser ce genre de choses proprement.

  7. #7
    say
    say est déconnecté
    Membre éprouvé
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 258
    Points
    1 258
    Par défaut
    Ah...moi je connais pas du tout.
    ça consiste en quoi?

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    boost.function définit un type fonction qui accepte toute sortes de fonctions (membre ou non). Cela a servi de base a ce qui, je crois bien, a été accepté pour le futur standard C++ de 2009.


    boost.bind est un moyen d'attacher facilement des paramètres à des fonctions (et au passage de définir de nouvelles fonctions ("foncteurs" pour être plus précis) en fixant des paramètres).

    boost.signal est une implémentation de signaux en C++.

    Je suis un peu court sur le temps. Je t'invite à regarder sur le site de boost (http://www.boost.org/) si tu veux en savoir plus.

    Bon WE.

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 21/08/2014, 15h21
  2. Comment passer en paramètre d'une méthode, une autre méthode ?
    Par Invité dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 31/03/2013, 03h59
  3. Réponses: 3
    Dernier message: 25/02/2010, 16h24
  4. Passage de paramétre dans une autre page
    Par olivier94 dans le forum Langage
    Réponses: 8
    Dernier message: 08/03/2007, 11h21
  5. [VB]Passage de Fonction en paramètre (d'une autre fonction)
    Par Australia dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 21/03/2006, 18h55

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