Comment appeler une fonction à l'aide d'un pointeur sur cette fonction

Comment appeler une fonction à l'aide d'un pointeur sur cette fonction - C - Programmation

Marsh Posté le 08-06-2004 à 19:18:33    

Je dois écrire une fonction qui prend en argument une liste de type générique. De ce fait lorsque j'écris ma fonction, je ne sait pas quel  type (de struct) sera passer en argument. Je veut donc faire appelle à un pointeur générique (void * compare;) qui pointera sur une autre fonction, mais qui peut changer. Comment coder l'appel cette autre fonction à l'aide d'un pointeu.

Reply

Marsh Posté le 08-06-2004 à 19:18:33   

Reply

Marsh Posté le 08-06-2004 à 19:28:10    

Carol Poulin a écrit :

Je dois écrire une fonction qui prend en argument une liste de type générique. De ce fait lorsque j'écris ma fonction, je ne sait pas quel  type (de struct) sera passer en argument. Je veut donc faire appelle à un pointeur générique (void * compare;) qui pointera sur une autre fonction, mais qui peut changer. Comment coder l'appel cette autre fonction à l'aide d'un pointeu.


 
je ne comprends pas ce que vous voulez faire mais pour déclarer un pointeur sur fonction et l'utiliser ensuite il faut faire comme suit:
 

Code :
  1. /* pour l'exemple */
  2. int ma_fonction_pointee(int param_a_la_con)
  3. {
  4.   return param_a_la_con;
  5. }
  6. void taratata()
  7. {
  8.   int (*ptr_func)(int)=ma_fonction_pointee; /* déclaration & affectation du pointeur */
  9.  
  10.   (*ptr_func)(3); /* appel */
  11. }


 

Reply

Marsh Posté le 08-06-2004 à 19:39:52    

moi en param_a_la_con je passe un pointeur sur une structure genre ctx (contexte), afin d'être générique, mais bon, ce n'est pas forcémment la panacée ...

Reply

Marsh Posté le 08-06-2004 à 20:26:37    

Comment je fait pour initialiser le pointeur de fonction déclaré à une adresse de fonction si la fonction dépend du type de struct passer en paramètre?
 

Code :
  1. /* pour l'exemple */
  2.   int ma_fonction_pointee1(TypeStruc1 param_a_la_con)
  3.   {
  4.       return 1;
  5.   }
  6.  
  7.   int ma_fonction_pointee2(TypeStruc2 param_a_la_con)
  8.   {
  9.       return 2;
  10.   }
  11.  
  12.   void taratata(void * param_a_la_con)
  13.   {
  14.       int (*ptr_func)(????)= ???? // =ma_fonction_pointee1 si param_a_la_con  
  15.    //est de type TypeStruc1 et ma_fonction_pointee2 si param_a_la_con  
  16.    //est de type TypeStruc2  
  17.      
  18.       (*ptr_func)(param_a_la_con); /* appel */
  19.   }

Reply

Marsh Posté le 08-06-2004 à 21:18:47    

Il sert à quoi le (int) entre parenthèse avant l'affectation Doc ?


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
Reply

Marsh Posté le 08-06-2004 à 21:19:36    

à l'exemple

Reply

Marsh Posté le 08-06-2004 à 21:20:18    

Taz a écrit :

à l'exemple


 
EDIT: cai bon...


Message édité par kfman le 08-06-2004 à 21:21:00

---------------
"Nous allons reformater les français" © Nicolas Sarkozy
Reply

Marsh Posté le 08-06-2004 à 21:31:31    

regarde comment fonctione qsort par exemple

Reply

Marsh Posté le 10-06-2004 à 02:21:47    

Pas besoin de deréférencer pour appeler la fonction : ptr_func(param_a_la_con) marche aussi bien.
 

Reply

Marsh Posté le 10-06-2004 à 07:11:42    

tout simplement parce qu'un jour, il a été décidé que ce n'était pas nécessaire. d'ou la validité de (*********************************************f)()

Reply

Marsh Posté le 10-06-2004 à 07:11:42   

Reply

Marsh Posté le 10-06-2004 à 08:35:19    

Carol Poulin a écrit :

Comment je fait pour initialiser le pointeur de fonction déclaré à une adresse de fonction si la fonction dépend du type de struct passer en paramètre?
 
Essaye de déclarer une union de tous les pointeurs de structure que tu utilises, et mets la en paramètre de tes fonctions.

Reply

Marsh Posté le 10-06-2004 à 08:45:31    

moi je dirais plutot fait de la généricité
 
// une fonction générique
int f(void* args);
 
struct FooArgs;
int Foo(void* args)
{
  struct FooArgs *fargs = args;
  // traitement
}
 
 
etc
 
 
encore une fois, j'ai donné plusieurs fois le même exemple sur comment faire
 

Reply

Sujets relatifs:

Leave a Replay

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