appel d'une fonction (execution) qui est definie par un char[] - C - Programmation
Marsh Posté le 17-07-2007 à 18:23:32
Le plus simple c'est de maintenir un tableau de correspondance entre un const char* et un pointeur de fonction. A chaque nom de fonction (ou identifiant quelconque, peu importe la façon dont tu définis ça) que tu reçois, tu parcours ta table de correspondance et, lorsque tu trouves la bonne occurence, tu appelles la fonction à partir du pointeur de fonction associé.
Ce qui impose évidemment que toutes tes fonctions aient le même prototype.
Des informations détaillées sur ce site : http://mapage.noos.fr/emdel/notes.htm#pointeurs
Marsh Posté le 17-07-2007 à 22:53:20
Kanonji a écrit : Bonjour, |
http://forum.hardware.fr/hfr/Progr [...] m#t1549114 (mon message du 24/4/2007)
Marsh Posté le 19-07-2007 à 08:55:25
Merci beaucoup,
j'avais pensé et on m'avait conseillé d'ailleurs de faire un pointeur de fonctions mais la question que je me pose maintenant est : Est ce possible sans pointeur de fonctions ??
L'objectif pour moi est de ne pas avoir à regarder une table de correspondance pour pouvoir executer la fonction souhaitée sans meme connaitre veritablement son nom. Cela doit etre generique au maximum.
Si ce n'est pas possible, j'ai une solution plus simple deja faite avec de simples if ....
Qu'en pensez vous ? Est ce possible ?
Merci d'avance
Ludovic
Marsh Posté le 19-07-2007 à 09:37:49
Impossible sans table de correspondance.
Mais à priori, cela ne devrait pas te poser de souci, pourquoi aurais-tu besoin de tant de généricité ?
Marsh Posté le 19-07-2007 à 20:11:41
Kanonji a écrit : Merci beaucoup, |
switch()... case
Kanonji a écrit : L'objectif pour moi est de ne pas avoir à regarder une table de correspondance pour pouvoir executer la fonction souhaitée sans meme connaitre veritablement son nom. Cela doit etre generique au maximum. |
T'auras pas plus générique qu'un pointeur de fonction !!!
Marsh Posté le 19-07-2007 à 21:22:28
Sve@r a écrit :
|
ce qui revient à déployer la boucle de parcourt du tableau de correspondance, donnant un switch..case de trois km de long d'une redoutable élégance.
Et encore, pour le cas où l'on peut réduire la chaîne de caractère en un identifiant numérique quelconque, sinon c'est if..else..if..else..if...
(je précise juste pour notre ami )
Marsh Posté le 19-07-2007 à 23:39:07
Kanonji a écrit : Merci beaucoup, |
Le principe d'une table de correspondance c'est que c'est generique justement. Forcement c'est du C c'est pas de l'objet, tu pense peut etre pas objet du tout. Mais si t'as un conteneur, il est rempli a un moment ou un autre, donc si le rempliçage est dynamique ça deviens une solution generique.
Arf enfin un peu de C est de Vector<String> ça aurai été pas mal. Et le mieux, en Java avec l'introspection de class on aurai pu meme trouver les fonction dynamiquement. Enfin la c'est HS.
Marsh Posté le 20-07-2007 à 03:36:23
kanonji> Quel est exactement l'utilité de ton programme ? Sais-tu ce qu'un pointeur de fonction ?
Ce morceau de pseudo code devrait marcher (après correction des potentielles erreurs de syntaxe) :
Code :
|
Marsh Posté le 20-07-2007 à 10:27:22
En C++ je conseillerais un dictionnaire STL qui remplacera avantageuse les "tables de correspondance".
La où cependant ça devient plus compliqué c'est de faire en sorte que les fonctions n'aient pas du tout le même type de retour ou n'aient pas les même paramètres. Parce que le void * et les pointeurs de fonctions... >_<
Marsh Posté le 20-07-2007 à 19:01:40
Olivier51 a écrit :
|
Ouaip. C'est l'idée. Eviter peut-être les identifiants en majuscules (conventionnellement attribué aux macros) et puis c'est parti...
Marsh Posté le 21-07-2007 à 07:47:56
patemino a écrit : En C++ je conseillerais un dictionnaire STL qui remplacera avantageuse les "tables de correspondance". |
Faut utiliser des foncteurs, boost::lambda ou loki::function. Enfin brf, enbcapsuler ces moches pointeurs de fonctions.
Marsh Posté le 17-07-2007 à 17:08:49
Bonjour,
je fais un programme qui me permet d'appeler de façon generique un ensemble de fonctions sans avoir à faire de cas particuliers.
A chaque "iteration", une variable FileToSet prend le nom de la fonction à executé dans le code C (et pas dans un shell fils).
Je voudrais savoir comment faire pour executer cette fonction.
Quelqu'un a une idée ?? (Pour precision, elle prend un argument).
Auparavant, j'ai testé avec system et execlp mais puisque ces derniers essaient d'executer la commande dans le shell, il est clair que cela ne marchait pas.
Merci d'avance pour votre aide.
Ludo