Accueil
 1  Debugging
 2  Utilisation d'un Debugger
 3  Valgrind
 4  Pointeurs de fonction
   
   
   
   
 

 Contacts

W3C validator

Département INF  
 Titre du cours


4 Pointeurs de fonction

  • Toute fonction a une adresse
    • foo désigne l’adresse de la fonction int foo(int a, char b);
    • l’adresse correspond à l’endroit où est situé le code dans la mémoire
  • Un pointeur de fonction 2 désigne l’adresse d’une fonction
  • Exemple de déclaration:
    • int (*function_ptr)(int a, char b) = foo;
  • Utilisation:
    • function_ptr(12, ‘f’); // appelle la fonction foo

    previous 


  • La déclaration d’un pointeur de fonction ressemble à la déclaration du prototype d’une fonction dont le nom serait (*nom_pointeur)
  • Comme un pointeur “normal”, un pointeur de fonction peut être initialisé à NULL
  • Comme pour un pointeur sur int qui ne peut pointer que sur une valeur de type int, un pointeur sur int (*f)(double, char, int) ne peut pointer que sur une fonction dont le prototype est int f(double, char, int);
  • Une fois initialisé, un pointeur de fonction peut s’utiliser comme une fonction “normale”.
  • Exemple:

    0cAp0x13-120004: function_pointer.c
     
    #include <stdio.h> 
    #include <stdlib.h> 
     
    double add(double a, double b) { 
      return a+b; 
    } 
     
    double substract(double a, double b) { 
      return a-b; 
    } 
     
    int main(int argc, char**argv) { 
      double n, m; 
      scanf("%lf", &n); 
      scanf("%lf", &m); 
      // declare a function pointer named "operation" 
      double (*operation)(double, double) = NULL; 
     
      if(n < m) { 
        /* operation points to the add function */ 
        operation = add; 
      } else { 
        /* operation points to the substract function */ 
        operation = substract; 
      } 
     
      /* call the function pointed to by operation */ 
      double result = operation(n, m); 
     
      printf("Result of the operation: %lf\n", result); 
     
      return EXIT_SUCCESS; 
    }
  • On peut définir un type (à l’aide du mot-clé typedef) correspondant à un pointeur de fonction. Par exemple:
        typedef double (*op_function)(double, double);

    définit le type op_function. On peut donc ensuite déclarer un pointeur de fonction de ce type en faisant:

        op_function operation;
  • Les pointeurs de fonctions sont utilisés pour faire de composants logiciels ou des plugins. Une interface est définie, par exemple:
    • il faut une fonction qui initialise la structure x
    • il faut une fonction qui calcule la structure x
    • il faut une fonction qui affiche la structure x

    Cela prend généralement la forme d’une structure contenant des pointeurs de fonction nommés callbacks:

        struct component { 
          char* plugin_name; 
          void (*init_value)(struct value*v); 
          void (*compute_value)(struct value*v); 
          void (*print_value)(struct value*v); 
        };

    Un plugin implémentant ce service allouera la structure et désignera ses fonctions comme callback pour le service.

François Trahay, Télécom SudParis, CSC4103 – Programmation système, 2019–2020

2.Oui, c’est sans rapport avec le debugging, mais pour équilibrer les séances, nous avons préféré ne pas aborder cette notion lors du cours sur les pointeurs :-)