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
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
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.
Envoyé par Freeze
Je sais que c'est possible à faire, mais je ne me souvient plus trop comment, je cherche et je te dit quoi.Envoyé par say
A plus
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:
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.
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(); .....
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 :
Ensuite, dans le point cpp:
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; } };
Et au moment où on parse:
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")); ...
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.
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; } } }
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);
Je trouve l'expliquation très bonne, je n'aurrai jamais fait mieux, (je suis une quiche en expliquation)
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?
Si BCB supporte, boost.function, boost.bind et boost.signal sont des moyens de réaliser ce genre de choses proprement.
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
Ah...moi je connais pas du tout.
ça consiste en quoi?
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.
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
Partager