Appeler une fonction dont le nom peut varier?

Appeler une fonction dont le nom peut varier? - C++ - Programmation

Marsh Posté le 12-10-2006 à 15:44:02    

Salut,
Je dois appeler differentes fonctions dont le nom depend d'un parametre que l'utilisateur me fournit en entree. En l'occurence:
- si l'utilisateur me donne la chaine "f1", je devrais appeler la fonction toto_f1
- si l'utilisateur me donne la chaine "f2", je devrais appeler la fonction toto_f2
- etc.
 
Je pensais faire une map entre les arguments possible ("f1", "f2",...) et le nom des fonctions a appeler (toto_f1, toto_f2, ...) et ensuite utiliser un pointeur de fonction qui s'initialiserait avec le bon nom de fonction. Mon probleme c'est que je ne sais pas comment faire. J'ai fait quelques tests simples pour voir:
 

Code :
  1. void toto_f1(int i)
  2. {
  3. ...
  4. }
  5. void (*fptr)(int);
  6. char str[10];
  7. strcat(str,"toto" );
  8. strcat(str,"f1" );
  9. printf("%s\n",str);
  10. fptr = (*str);


Bien sur ca ne marche pas puisque j'essaye de convertir un char * en une fonction...
Je ne sais pas comment faire pour dire au compilo que je veux atteindre la fonction qui correspond au nom que je lui donne.
 
Pouvez-vous m'aider?
Merci

Reply

Marsh Posté le 12-10-2006 à 15:44:02   

Reply

Marsh Posté le 12-10-2006 à 16:06:50    

La méthode classique consiste à utiliser des pointeurs de fonctions...
Ensuite, le dispatch se fait par un tableau, des "if" ou un switch, peu importe.
Une réelle solution serait d'utiliser dlopen/dlsym (sous Linux) ou LoadLibrary/GetProcAddr (sous Windows)... Mais c'est lourd !!!

Reply

Marsh Posté le 12-10-2006 à 16:12:25    

spotaszn a écrit :

La méthode classique consiste à utiliser des pointeurs de fonctions...
Ensuite, le dispatch se fait par un tableau, des "if" ou un switch, peu importe.
Une réelle solution serait d'utiliser dlopen/dlsym (sous Linux) ou LoadLibrary/GetProcAddr (sous Windows)... Mais c'est lourd !!!


 
Oui tu as raison je vais utiliser une map ou quelque chose du genre pour faire ma correspondance. Je n'y avais pas pense :-) Merci encore!

Reply

Marsh Posté le 12-10-2006 à 16:38:53    

En C++ ou en C ?


---------------
Töp of the plöp
Reply

Marsh Posté le 12-10-2006 à 17:11:59    

_darkalt3_ > d'après la tentative infructueuse qu'il nous propose, je dirais en "C avec des classes"...

Reply

Marsh Posté le 12-10-2006 à 17:47:46    

Je pensais plus gentiment à un gourrage de cat ;)


---------------
Töp of the plöp
Reply

Marsh Posté le 13-10-2006 à 22:32:55    

l'idee de la map est pas mal :
 
de tete :
 
typedef T_fonction void(*f)(int);
 
struct myLessThan
{
  bool operator()(const char* s1, const char* s2) const
  {
    return strcmp(s1, s2) < 0;
  }
};
 
map<string, T_fonction, myLessThan> m;
m["toto_f1"] = toto_f1;
m["toto_f2"] = toto_f2;
 
maintenant :
map<string, T_fonction, myLessThan>::const_iterator ite;
if ( (ite=m.find(fname))!=m.end())
{
  int argument = 5;  
  T_fonction fPtr = ite->second;
  fPtr(5);
}

Reply

Marsh Posté le 15-10-2006 à 12:25:04    

je sais pas si ca aide pour du c++ (ya peut-être un équivalent), mais en php on peut construire des noms comme ca :
$i=7;
$toto_f{$i} = 5;
echo $toto_f7;//affiche 5

Reply

Marsh Posté le 15-10-2006 à 13:14:09    

langage compilé(c++) != langage interprété(PHP)

Reply

Marsh Posté le 15-10-2006 à 13:17:20    

DarWog a écrit :

je sais pas si ca aide pour du c++ (ya peut-être un équivalent), mais en php on peut construire des noms comme ca :
$i=7;
$toto_f{$i} = 5;
echo $toto_f7;//affiche 5


oui mais non, ça n'a rien à voir.


---------------
Töp of the plöp
Reply

Marsh Posté le 15-10-2006 à 13:17:20   

Reply

Marsh Posté le 15-10-2006 à 15:29:54    

DarWog a écrit :

je sais pas si ca aide pour du c++ (ya peut-être un équivalent), mais en php on peut construire des noms comme ca :
$i=7;
$toto_f{$i} = 5;
echo $toto_f7;//affiche 5


 
Il y a fort à parier qu'il vient d'un langage du type PHP, pour vouloir composer le nom d'une fonction ainsi...

Reply

Sujets relatifs:

Leave a Replay

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