Appeller une fonction avec son adresse, comme paramètre d'une autre fonction

Re-bonjour, cette fois-ci.

Dans le cadre d'un projet, j'aimerais appeller une fonction, mais choisie comme paramètre.

Un peu une sorte de

void maFonction(void* adresseFonction)
{
//Code supplémentaire
*adresseFonction;
}

mais pour la mémoire Flash.

Bonjour,

Comme ceci

void maFonction(void (* adresseFonction)())
{
//Code supplémentaire
  adresseFonction();
}

Merci beaucoup. Et pour appeler cette fonction, on fait comment ?

Comme ceci par exemple:

void setup() {
  Serial.begin(115200);
  maFonction(test);
  maFonction(test2);
}

void loop() {
  // put your main code here, to run repeatedly:

}

void maFonction(void (* adresseFonction)())
{
  Serial.println("maFonction");
  adresseFonction();
}

void test()
{
  Serial.println("test");
}

void test2()
{
  Serial.println("test2");
}
1 Like

Parfait merci beaucoup !

On peut faire ça aussi pour lui donner un paramètre ?

void maFonction(void (* adresseFonction)(unsigned long temps))

Bonjour @techvij,
Etant donné qu'on ne fait que transmettre une adresse, il me semble difficile de transmettre en plus un paramètre à la fonction.
Donc je pense que non mais je laisse les pros te répondre mieux que moi.
Il y a peut-être une solution que je ne connais pas.

Bon dimanche

Comme le dit @philippe86220 je ne vois pas comment tu pourras transmettre le paramètre.

Une bonne explication ici, avec le passage d'arguments

Merci @fdufnews
Donc possible et pas très compliqué à mettre en œuvre.

Bonne journée

Oui, si on passe le paramètre comme un argument supplémentaire de la fonction appelante.

Oui @kamill et ça donne ça :

Ce n’est peut-être pas ce que voulait exactement @techvij

Bon dimanche

Finalement c'est quelque chose comme ça que je voudrais :

void maFonction (void (*pf)(int)){

//Mon code de la fonction

(*pf)(82);
}

Non testé.

A l’aide @J-M-L :wink:
Help :wink:

Je ne vais pas faire quelque chose de si compliqué.

Je ne trouve pas si compliqué la manipulation d'adresse.

En lisant attentivement les docs, ça devrait passer.

Oui, tu peux faire comme ça si l'argument est constant (ou défini ou calculé) dans la fonction maFonction.

remarque: Tu peux écrire pf(82) au lieu de (*pf)(82)

@techvij, @kamill,
J’ai du mal à comprendre dans quels cas on peut utiliser ce type de fonction ?
Quelle peut être son utilité ?
Ce n’est pas que je mets en doute son efficacité mais c’est que mon manque d’expérience m’empêche de comprendre en quoi elle est utile et dans quels cas ?

Merci

Si j'ai demandé comment faire, c'est justement pour une raison.

Je souhaite faire une fonction qui fait une fenêtre sur un écran tactile, donc j'ai besoin d'afficher la barre, le bouton fermer, et le logo (pour l'instant, je ne vais pas m'embêter avec une couleur variable, qui fait très moche en plus)

J'ai donc besoin du nom de la fenêtre (const char* titre) et l'adresse de la fonction permettant d'afficher le l'icône de l'application.

Mais pourquoi pas afficher une image directement ?

pour éviter que cela soit pixellisé. Ce n'est pas une photo, mais un logo, donc je souhaite le rendre vectoriel.

Une fonction permet de la réutiliser plusieurs fois, et les paramètres vont varier ! Alors comment tu vasa faire pour afficher une image faite de pixel ?

Je ne vais pas forcément le faire, mais si je le fait, alors je vais adapter mon code.

La fonction d'affichage est variable?

Oui, le texte à afficher peut dépendre, ainsi que l'icône.