appel d'une fonction (execution) qui est definie par un char[]

appel d'une fonction (execution) qui est definie par un char[] - C - Programmation

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

Reply

Marsh Posté le 17-07-2007 à 17:08:49   

Reply

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


Message édité par Elmoricq le 17-07-2007 à 18:24:16
Reply

Marsh Posté le 17-07-2007 à 22:53:20    

Kanonji a écrit :

Bonjour,
 
je fais un programme qui me permet d'appeler de façon generique un ensemble de fonctions sans avoir à faire de cas particuliers.


http://forum.hardware.fr/hfr/Progr [...] m#t1549114 (mon message du 24/4/2007)


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

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

Reply

Marsh Posté le 19-07-2007 à 09:09:50    

Non, ce n'est pas possible.

Reply

Marsh Posté le 19-07-2007 à 09:27:03    

system("bash" );

Reply

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é ?

Reply

Marsh Posté le 19-07-2007 à 20:11:41    

Kanonji a écrit :

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 ??


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 !!!

Message cité 1 fois
Message édité par Sve@r le 19-07-2007 à 20:24:46

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 19-07-2007 à 20:12:43    

GetProcAddress ....
ok je sors :D

Reply

Marsh Posté le 19-07-2007 à 21:22:28    

Sve@r a écrit :


switch()... case

 


 

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... [:god]
(je précise juste pour notre ami :o)


Message édité par Elmoricq le 19-07-2007 à 21:23:34
Reply

Marsh Posté le 19-07-2007 à 21:22:28   

Reply

Marsh Posté le 19-07-2007 à 23:39:07    

Kanonji a écrit :

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


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. :D Et le mieux, en Java avec l'introspection de class on aurai pu meme trouver les fonction dynamiquement. :D Enfin la c'est HS.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

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 :
  1. int kikoo(int a) { return a+1; }
  2. int func2(int a) { return a+2+10-10; }
  3. int loool(int a) { return a+3; }
  4. int multiple(int b) { printf("J'aime la salade du jardin\n" ); return 3;}
  5. typedef int (*T_MYFUNC)(int);
  6. T_MYFUNC lapluiecestkool[] = { kikoo, func2, lool, multiple };
  7. int main() {
  8. int i = 0;
  9. while (1) {
  10.   lapluiecestkool[i%4](i);
  11.   i++;
  12. }
  13. }

Reply

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... >_<

Message cité 1 fois
Message édité par patemino le 20-07-2007 à 10:28:05
Reply

Marsh Posté le 20-07-2007 à 19:01:40    

Olivier51 a écrit :

Code :
  1. typedef int (*T_MYFUNC)(int);
  2. T_MYFUNC lapluiecestkool[] = { kikoo, func2, lool, multiple };



Ouaip. C'est l'idée. Eviter peut-être les identifiants en majuscules (conventionnellement attribué aux macros) et puis c'est parti...


Message édité par Sve@r le 21-07-2007 à 11:32:18

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

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".
 
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... >_<


 
Faut utiliser des foncteurs, boost::lambda ou loki::function. Enfin brf, enbcapsuler ces moches pointeurs de fonctions.

Reply

Marsh Posté le 21-07-2007 à 11:19:27    

Ouep, tout à fait :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed