Aujourd'hui j'ai eu envie de me faire plaisir et comme j'adore coder (à mon tout petit niveau bien sûr) je me suis dit que j'allais travailler un tout petit peu sur "les pointeurs sur fonction". Bon bien sûr les "pros" (sourire) n'y apprendrons rien mais on ne sait jamais, un débutant comme moi pourra tout à fait y trouver un interêt.
Toute fonction dispose d'une adresse du code binaire qui la constitue, bon là je ne rentre pas trop dans les détails, je reste simple :
Imaginons que je veuille déclarer un pointeur sur une fonction qui calcule la somme de deux entiers d'un octet non signé :
uint8_t somme (uint8_t x, uint8_t y)
{
return x + y;
}
il faut que m'y prenne comme ceci :
type (*identificateur)(paramètres);
Pour la fonction somme ça donne ça :
uint8_t (*ptrFonct)(uint8_t, uint8_t); // pointeur sur fonction avec deux paramètres
Voici un exemple complet avec deux fonctions :
uint8_t (*ptrFonct)(uint8_t, uint8_t); // pointeur sur fonction avec deux paramètres
void setup() {
Serial.begin(115200);
ptrFonct = &somme; // affectation de l'adresse de la fonction somme
Serial.println((*ptrFonct) (4,9));
ptrFonct = &multiplication; // affectation de l'adresse de la fonction multiplication
Serial.println((*ptrFonct) (2,3));
}
void loop() {}
uint8_t somme (uint8_t x, uint8_t y)
{
return x + y;
}
uint8_t multiplication (uint8_t x, uint8_t y)
{
return x * y;
}
C'est simple non ?
Après voici un autre exemple pour les jeunes qui voudront se souvenir des tables de multiplications :
uint8_t (*ptrFonct)(uint8_t, uint8_t);
void setup() {
Serial.begin(115200);
ptrFonct = &multiplication; // affectation de l'adresse de la fonction multiplication
}
void loop() {
uint8_t quelleTable;
Serial.println(F("Entrez un chiffre de 1 à 10 (vous pouvez dépasser mais n'oubliez pas que vous travaillez avec des octets non signés)"));
quelleTable = entree();
for (uint8_t x = 0; x < 10; x++) {
Serial.print(quelleTable); Serial.print(" * "); Serial.print(x + 1); Serial.print(" = ");
Serial.println((*ptrFonct) (quelleTable, x + 1));
}
Serial.print('\n');
}
uint8_t multiplication (uint8_t x, uint8_t y)
{
return x * y;
}
uint8_t entree()
{
char caractere;
while (!Serial.available());
uint8_t chiffre = Serial.parseInt();
while (Serial.readBytes(&caractere, 1) != 0) {
if (caractere == '\r') {
break;
}
}
return chiffre;
}
Voilà c'est plutôt du C ici mais on retrouve des pointeurs de fonctions quand on applique par exemple des méthodes à des objets (POO) mais là c'est une autre histoire.
PS : Je ne fais pas cette toute petite synthèse pour faire le malin mais juste pour apporter peut-être un petit plus à un débutant comme moi et surtout ça me permet de synthétiser mes connaissances et de mieux les retenir.