pointeur vers une fonction depuis une classe

Bonjour, je travail sur une classe de gestion de boutons, j'utilise ce code, avec pour but de déclarer un fonction a appeler pour chaque boutons, quand le bouton est cliqué, ça me plante au moment de lancer cette fonction extérieur a la classe depuis la classe

#include<vector>


void retour(){
  
}
void suite(){
  
}

class boutonsPage{
  public:
    boutonsPage(uint32_t x, uint32_t y, uint32_t h, uint32_t l,void (* fonction));
    void test(uint32_t px, uint32_t py);
  private:
    uint32_t x;
    uint32_t y;
    uint32_t h;
    uint32_t l;
    void (* fonction);
};
boutonsPage::boutonsPage(uint32_t x, uint32_t y, uint32_t h, uint32_t l,void (* fonction)){
  this->x=x;
  this->y=y;
  this->h=h;
  this->l=l;
  this->fonction=fonction;
}
void boutonsPage::test(uint32_t px, uint32_t py){
  if(x<=px<=(x+l) and y<=py<=(y+h)){
    *fonction();
  }
}

Qu'est ce que je fait mal svp :wink:
message erreur :

F:\Mes documents\Documents\Arduino\teststrucVecteur\teststrucVecteur.ino: In member function 'void boutonsPage::test(uint32_t, uint32_t)':
teststrucVecteur:32:15: error: expression cannot be used as a function
     *fonction();
               ^
exit status 1
expression cannot be used as a function

Et si tu écris ceci à la place:
...
void (* fonction)(void); // Pointeur sur une fonction qui ne prend pas d'argument et ne renvoie aucun argument.

Ensuite si tu as défini quelque part une fonction:

void MyFunc(void);
Alors tu peux faire correspondre cette fonction à ton pointeur sur fonction avec :

fonction = MyFunc; // A noter qu'elles doivent être strictement du même type

Je ré édite le code ' complet ' :

class boutonsPage{
  public:
    boutonsPage(uint32_t x, uint32_t y, uint32_t h, uint32_t l,void (* onClik)(void));
    void test(uint32_t px, uint32_t py);
  private:
    uint32_t x;
    uint32_t y;
    uint32_t h;
    uint32_t l;
  // ici la fonction extérieur a la classe a utiliser en cas de clic dans le bouton
    void onClik(void);
};
boutonsPage::boutonsPage(uint32_t x, uint32_t y, uint32_t h, uint32_t l,void (* fonction)(void)){
  //j'affecte a mes variables de classe les valeur du bouton
  this->x=x;
  this->y=y;
  this->h=h;
  this->l=l;
  // ici la fonction extérieur a la classe a utiliser en cas de clic dans le bouton
  this->onClik(void)=&fonction(void);// <======= problème !
}
void boutonsPage::test(uint32_t px, uint32_t py){
  //je control si le clic est dans la zone du bouton
  if(x<=px<=(x+l) and y<=py<=(y+h)){
    //puisque le clic est dans la zone je lance la fonction qui a était déclaré
    onClik();
  }
}

//////////////////////////////////

#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();

// je déclare un bouton nommé bt1
// a une position x=0, y=0 de largeur 100 et hauteur 50
// et donc le clic on lance la fonction " fermer "
boutonsPage bt1(0,0,100,50,fermer);

void fermer(void){
  //les actions
}
void setup() {
  
}
void loop() {
  //je cré des variable pour les position x,y du clic  
  uint16_t t_x = 0, t_y = 0;  
  // je récupère ces position avec test de clic
  boolean pressed = tft.getTouch(&t_x, &t_y, 100);
  // s'il y a clic
  if(pressed){
    //je lance test avec les position du clic
    bt1.test(t_x,t_y);
  }
}

la question est vraiment de savoir comment pointer convenablement la fonction externe a la classe pour la lancer depuis la classe :wink:

Ça sa fonctionne :

class boutonsPage{
  public:
    boutonsPage(uint32_t x, uint32_t y, uint32_t h, uint32_t l);
    void test(uint32_t px, uint32_t py,void (*onClik)(void));
  private:
    uint32_t x;
    uint32_t y;
    uint32_t h;
    uint32_t l;
};
boutonsPage::boutonsPage(uint32_t x, uint32_t y, uint32_t h, uint32_t l){
  //j'affecte a mes variables de classe les valeur du bouton
  this->x=x;
  this->y=y;
  this->h=h;
  this->l=l;
}
void boutonsPage::test(uint32_t px, uint32_t py,void (*onClik)(void)){
  //je control si le click est dans la zone du bouton
  if(x<=px<=(x+l) and y<=py<=(y+h)){
    //puisque le click est dans la zone je lance la fonction qui a etait déclaré
    onClik();
  }
}

//////////////////////////////////

#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();

void fermer(void){
  //les actions
}

// je declare un bouton nomé bt1
// a une position x=0, y=0 de largeure 100 et hauteur 50
// et donc le click on lance la fonction " fermer "
boutonsPage bt1(0,0,100,50);
void setup() {
  
}
void loop() {
  //je cre des variable pour les position x,y du click  
  uint16_t t_x = 0, t_y = 0;  
  // je recuper ces position avec test de click
  boolean pressed = tft.getTouch(&t_x, &t_y, 100);
  // s'il y a click
  if(pressed){
    //je lance test avec les position du click
    bt1.test(t_x,t_y,&fermer);
  }
}

mais je voudrais declarrer et stocker des le debut ce pointeur vers fonction, une idée ?

Ok trouvé par tâtonnement, pour info :

class boutonsPage{
  public:
    boutonsPage(uint32_t x, uint32_t y, uint32_t h, uint32_t l,void (*onClik)(void));
    void test(uint32_t px, uint32_t py);
  private:
    uint32_t x;
    uint32_t y;
    uint32_t h;
    uint32_t l;
    void (*fnc)(void);
  // ici la fonction exterieur a la classe a utiliser en cas de click dans le bouton
};
boutonsPage::boutonsPage(uint32_t x, uint32_t y, uint32_t h, uint32_t l,void (*onClik)(void)){
  //j'affecte a mes variables de classe les valeur du bouton
  this->x=x;
  this->y=y;
  this->h=h;
  this->l=l;
  fnc=onClik;
}
/*
boutonsPage::inits(void (*fonction)()){
  // ici la fonction exterieur a la classe a utiliser en cas de click dans le bouton
  this->onClik()=&fonction;// <======= probléme !
}*/
void boutonsPage::test(uint32_t px, uint32_t py){
  //je control si le click est dans la zone du bouton
  if(x<=px<=(x+l) and y<=py<=(y+h)){
    //puisque le click est dans la zone je lance la fonction qui a etait déclaré
    fnc();
  }
}

//////////////////////////////////

#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();

void fermer(void){
  //les actions
}

// je declare un bouton nomé bt1
// a une position x=0, y=0 de largeure 100 et hauteur 50
// et donc le click on lance la fonction " fermer "
boutonsPage bt1(0,0,100,50,&fermer);
//bt1.onClik=;
void setup() {
  
}
void loop() {
  //je cre des variable pour les position x,y du click  
  uint16_t t_x = 0, t_y = 0;  
  // je recuper ces position avec test de click
  boolean pressed = tft.getTouch(&t_x, &t_y, 100);
  // s'il y a click
  if(pressed){
    //je lance test avec les position du click
    bt1.test(t_x,t_y);
  }
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.