Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1320 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1587765
Kanonji
que la force soit avec toi
Posté le 17-07-2007 à 17:08:49  profilanswer
 

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

mood
Publicité
Posté le 17-07-2007 à 17:08:49  profilanswer
 

n°1587812
Elmoricq
Modérateur
Posté le 17-07-2007 à 18:23:32  profilanswer
 

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
n°1587880
Sve@r
Posté le 17-07-2007 à 22:53:20  profilanswer
 

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.
n°1588585
Kanonji
que la force soit avec toi
Posté le 19-07-2007 à 08:55:25  profilanswer
 

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

n°1588594
matafan
Posté le 19-07-2007 à 09:09:50  profilanswer
 

Non, ce n'est pas possible.

n°1588602
Taz
bisounours-codeur
Posté le 19-07-2007 à 09:27:03  profilanswer
 

system("bash" );

n°1588612
Elmoricq
Modérateur
Posté le 19-07-2007 à 09:37:49  profilanswer
 

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

n°1589037
Sve@r
Posté le 19-07-2007 à 20:11:41  profilanswer
 

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.
n°1589038
Ace17
Posté le 19-07-2007 à 20:12:43  profilanswer
 

GetProcAddress ....
ok je sors :D

n°1589049
Elmoricq
Modérateur
Posté le 19-07-2007 à 21:22:28  profilanswer
 

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
mood
Publicité
Posté le 19-07-2007 à 21:22:28  profilanswer
 

n°1589086
MEI
|DarthPingoo(tm)|
Posté le 19-07-2007 à 23:39:07  profilanswer
 

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 |
n°1589095
Olivier51
Posté le 20-07-2007 à 03:36:23  profilanswer
 

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

n°1589178
patemino
Fan Club VP
Posté le 20-07-2007 à 10:27:22  profilanswer
 

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
n°1589592
Sve@r
Posté le 20-07-2007 à 19:01:40  profilanswer
 

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.
n°1589658
Joel F
Real men use unique_ptr
Posté le 21-07-2007 à 07:47:56  profilanswer
 

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.

n°1589675
patemino
Fan Club VP
Posté le 21-07-2007 à 11:19:27  profilanswer
 

Ouep, tout à fait :jap:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Appeler une fonction C à partir d'un shellAttendre un évènement pour continuer l'exécution de mon programme
[fonction] pour convertir les accents et choses non ascii ?[C] Fonction niveau debutant
[Excel] extraire une valeur d'un tableau en fonction de 2 index[resolu]fonction qui modifie els paramètrs d'entrée
Frames et fonction setTimeoutTypage strict pour parametres de fonction : question sur cas précis
Adapter mon image de fond en fonction de la résolution de l'écranFonction js avec paramètre PHP
Plus de sujets relatifs à : appel d'une fonction (execution) qui est definie par un char[]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR