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

  FORUM HardWare.fr
  Programmation
  C++

  Appeler une fonction dont le nom peut varier?

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Appeler une fonction dont le nom peut varier?

n°1456148
agyspace
Posté le 12-10-2006 à 15:44:02  profilanswer
 

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

mood
Publicité
Posté le 12-10-2006 à 15:44:02  profilanswer
 

n°1456169
spotaszn
Posté le 12-10-2006 à 16:06:50  profilanswer
 

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

n°1456175
agyspace
Posté le 12-10-2006 à 16:12:25  profilanswer
 

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!

n°1456202
_darkalt3_
Proctopathe
Posté le 12-10-2006 à 16:38:53  profilanswer
 

En C++ ou en C ?


---------------
Töp of the plöp
n°1456264
spotaszn
Posté le 12-10-2006 à 17:11:59  profilanswer
 

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

n°1456299
_darkalt3_
Proctopathe
Posté le 12-10-2006 à 17:47:46  profilanswer
 

Je pensais plus gentiment à un gourrage de cat ;)


---------------
Töp of the plöp
n°1457068
joneal
Posté le 13-10-2006 à 22:32:55  profilanswer
 

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);
}

n°1457463
DarWog
Posté le 15-10-2006 à 12:25:04  profilanswer
 

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

n°1457487
bigears
Posté le 15-10-2006 à 13:14:09  profilanswer
 

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

n°1457489
_darkalt3_
Proctopathe
Posté le 15-10-2006 à 13:17:20  profilanswer
 

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
mood
Publicité
Posté le 15-10-2006 à 13:17:20  profilanswer
 

n°1457543
spotaszn
Posté le 15-10-2006 à 15:29:54  profilanswer
 

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


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

  Appeler une fonction dont le nom peut varier?

 

Sujets relatifs
[PHP] Exploiter le premier elt d'un array retourné par une fonction?Contenu html en fonction du browser
PHP : Fonction mail() bloque ma pagephpBB, fonction mail et OVH
[RESOLU] tab multidimensionel en paramètre d'une fonction[.NET] StreamReader, position dans un fichier, fonction peek et seek
Notice: Undefined offset d'une fonction dans une classehelp sur une fonction
aide OpenOffice.org utiliser la fonction "RECHERCHEV"fonction qui n'accepte que certains caracteres dans une chaine
Plus de sujets relatifs à : Appeler une fonction dont le nom peut varier?


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