Catégories
Arduino

Arduino #38: Pointeur de fonction en 3 étapes

Objectifs

  1. Savoir l’utilité d’un pointeur de fonction
  2. Savoir utiliser un pointeur de fonction
  3. Exemple pratique: A0-A1
  4. Etc.

Problématique

On dispose d’une fonction qui calcule la fonction de trois variables de types entiers, puis elle retourne le résultat. Notre objectif sera de déclarer un pointeur qui sera pointé vers la fonction fSomme().

int fSomme(int a0, int a1, int a2)

{

    return a0+a1+a2;

}
int fSomme(int a0, int a1, int a2)

{

    return a0+a1+a2;

}
int fSomme(int a0, int a1, int a2)

{

    return a0+a1+a2;

}
int fSomme(int a0, int a1, int a2)

{

    return a0+a1+a2;

}

Syntaxe

La syntaxe basique de la déclaration d’une fonction est la suivante:

int fSomme(int, int, int);

Pour déclarer un pointeur du même type, la nouvelle syntaxe mélange entre la déclaration d’une fonction et l’introduisant de la notion du pointeur. Il suffit de remplacer le nom de la fonction  « fSomme » par le nom de notre pointeur (exemple « p_fSomme »)précédé par une étoile « * »  de la façon suivante:

int (*p_fSomme)(int, int, int);

Comment initialiser le pointeur d’une fonction ?

Ce n’est pas encore finit! La déclaration d’un pointeur n’est pas suffisante, il faut ensuite le pointer vers la fonction pour qu’on puisse l’utilisé. Il suffit d’utiliser le nom de la fonction « fSomme » ou bien son adresse « &fSomme ». La syntaxe est semblable à l’utilisation du nom d’un tableau pour indiquer l’adresse du premier élément. La syntaxe est la suivante:

p_fSomme=fSomme;

// ou bien

p_fSomme=&fSomme;

Concrètement, à quoi sert le pointeur d’une fonction ?

  1. Le pointeur d’une fonction est pratique lorsque ‘on a besoin de passer une fonction en argument d’une autre fonction. On a l’habitude d’avoir en entrée d’une fonction les variables scalaires ou des pointeurs, mais rien ne vous empêche d’avoir une fonction ou plusieurs fonctions en entrée d’une autre fonction!
  2. Clonage d’une fonction existante: Il se peut que le nom d’une fonction n’est pas lisible ou non comptable avec le rôle de la fonction. Grâce au pointeur d’une fonction on peut dupliquer la fonction en choisissons le nom qui nous arrange.
  3. Faire compliquer le code 🙂

Exemple: somme de 4 signaux

Fonction secondaire – calcule de la somme de 3 signaux

int fSomme3(int a0, int a1, int a2)

{

    return a0+a1+a2;

}

Déclaration et affectation du pointeur

int (p_fSomme3*)(int a0, int a1, int a2)

p_fSomme3=fSomme3;

Fonction principale – Calcule de la somme de 4 signaux

int fSomme4(int a4, int somme_a0_a2)

{

    return a4+somme_a0_a2;

}

Appel de la fonction en utilisant le pointeur d’une fonction

int somme_4;

somme_4=fSomme4(a0, p_fSomme3(a0,a1,a2));

Ou bien

somme_4=fSomme4(a0, fSomme3(a0,a1,a2));

Comment savoir l’adresse d’une fonction

unsigned long Add_func;

Serial.print("Adresse fSomme3: ");

Serial.println(Add_func=&fSomme3);

delay(1000);

Programme principal

unsigned int A0_int, A1_int, A2_int, A3_int;

int somme_4,somme_4p,somme_4b; 







// Déclaration du pointeur de la fonction 

int (*p_fSomme3)(int a0, int a1, int a2);




// Fonction principale - Calcul de la somme de 4 signaux

int fSomme4(int a4, int somme_a0_a2)

{

    return a4+somme_a0_a2;

}




// Fonction secondaire - calcule de la somme de 3 signaux

int fSomme3(int a0, int a1, int a2)

{

    return a0+a1+a2;

}




void setup() {

  // Init serial port

  Serial.begin(9600);




  // Affectation - Initialisation du pointeur

  //p_fSomme3=fSomme3;

  // Ou bien

  p_fSomme3=&fSomme3;

}




void loop() {

  // Lecture des entrées analogiques

  A0_int=analogRead(A0);

  A1_int=analogRead(A1);

  A2_int=analogRead(A2);

  A3_int=analogRead(A3);




  // Calcule de la somme des canaux sans pointeur

  somme_4=fSomme4(A3_int, fSomme3(A0_int,A1_int,A2_int));




  // Calcule de la somme des canaux avec pointeur

  somme_4p=fSomme4(A3_int, p_fSomme3(A0_int,A1_int,A2_int));




  // Calcule basic de la somme des canaux 

  somme_4b=A0_int+A1_int+A2_int+A3_int;




  // Affichage 

  //Serial.print(somme_4);Serial.print(",");

  //Serial.print(somme_4p);Serial.print(",");

  //Serial.println(somme_4b);//Serial.print(",");




  // Affichage de l'adresse de la fonction

  unsigned long Add_func;

  Serial.print("Adresse fSomme3: ");

  Serial.println(Add_func=&fSomme3);

  Serial.print("Pointeur fSomme3: ");

  Serial.println(Add_func=p_fSomme3);

  delay(1000);




  // Délai affichage

  delay(10);  

}

Sujets connexes

  • pointeur arduino exemple
  • pointeur en c
  • tableau pointeur sur fonction
  • fonction pointeur c
  • tableau arduino
  • pointeur classroom
  • pointeur arduino exemple
  • tableau pointeur sur fonction
  • pointeur c’
  • pointeur de fonction
  • pointeur sur fonction
  • tableau de pointeur
  • pointeur informatique

Laisser un commentaire