Le 30/04/2020 à 18:05, Frédéric a écrit :
> Hello,
>
> Je développe une petite appli Arduino qui utilise cette librairie :
>
> https://github.com/jonblack/arduino-menusystem
>
> J'essaye d'implémenter cet exemple :
>
> https://github.com/jonblack/arduino-menusystem/blob/master/examples/led_matrix/led_matrix.ino
>
> de manière plus objet. Je voudrais que les callbacks on_xxx_selected()
> deviennent les membres d'une classe où, en gros, je rapatrie tout ce qui
> est après la ligne 88.
>
> Mais ça ne marche pas, j'obtiens l'erreur :
>
> --------------
>
> /tmp/arduino_build_965784/sketch/myMenu.cpp: In constructor 'MyMenu::MyMenu(MyRenderer*)':
> myMenu.cpp:12:39: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say '&MyMenu::on_time_selected' [-fpermissive]
> m_mi_time = new MenuItem("TIME", &on_time_selected);
> ^
> myMenu.cpp:12:55: error: no matching function for call to 'MenuItem::MenuItem(const char [5], void (MyMenu::*)(MenuComponent*))'
> m_mi_time = new MenuItem("TIME", &on_time_selected);
> ^
> In file included from /tmp/arduino_build_965784/sketch/myMenu.h:4:0,
> from /tmp/arduino_build_965784/sketch/myMenu.cpp:4:
> /home/fma/Arduino/libraries/arduino-menusystem/MenuSystem.h:195:5: note: candidate: MenuItem::MenuItem(const char*, MenuComponent::SelectFnPtr)
> MenuItem(const char* name, SelectFnPtr select_fn);
> ^
> /home/fma/Arduino/libraries/arduino-menusystem/MenuSystem.h:195:5: note: no known conversion for argument 2 from 'void (MyMenu::*)(MenuComponent*)' to 'MenuComponent::SelectFnPtr {aka void (*)(MenuComponent*)}'
>
> --------------
>
> Du coup, j'ai essayé de déclarer ces callback static, mais là, j'obtiens :
>
> --------------
>
> myMenu.cpp:65:69: error: cannot declare member function 'static void MyMenu::on_time_selected(MenuComponent*)' to have static linkage [-fpermissive]
> static void MyMenu::on_time_selected(MenuComponent* p_menu_component)
>
> --------------
>
> Une idée comment corriger ça ? J'ai joint la classe en question...
>
> Merci d'avance pour vos lumières.
>
ca me semble tout a fait normal.
tu as le pointeur vers la fonction... mais tu n'envoies pas le pointeur
vers l'instance de l'objet que tu cherches a appeler dans l'appel a la
fonction, ca ne peut donc pas marcher.
il te faut utiliser une lambda closure pour capturer le pointeur this:
https://forum.arduino.cc/index.php?topic=639969.0