Jak przekazać wskaźnik do funkcji

krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

Jak przekazać poprawnie wskaźnik do funkcji SuplaDevice.setStatusFuncImpl(&status_func) która znajduje się w klasie SuplaConfigESP??

Przykładowy kod:

plik SuplaConfigESP.cpp

Code: Select all

#include "SuplaConfigESP.h"

SuplaConfigESP::SuplaConfigESP() {
  SuplaDevice.setStatusFuncImpl(&status_func);
}

void SuplaConfigESP::status_func(int status, const char *msg) {
  switch (status) {
    case 2:
      supla_status.status_msg = "Już zainicjalizowane";
      break;
    case 3:
      supla_status.status_msg = "Nie przypisane CB";
      break;
    case 4:
      supla_status.status_msg = "Nieprawidłowy identyfikator GUID lub rejestracja urządzeń NIEAKTYWNA";
      break;
    case 5:
      supla_status.status_msg = "Nieznany adres serwera";
      break;
    case 6:
      supla_status.status_msg = "Nieznany identyfikator ID";
      break;
    case 7:
      supla_status.status_msg = "Zainicjowany";
      break;
    case 8:
      supla_status.status_msg = "Przekroczono limit kanału";
      break;
    case 9:
      supla_status.status_msg = "Rozłączony";
      break;
    case 10:
      supla_status.status_msg = "Rejestracja w toku";
      break;
    case 11:
      supla_status.status_msg = "Błąd zmiennej";
      break;
    case 12:
      supla_status.status_msg = "Błąd wersji protokołu";
      break;
    case 13:
      supla_status.status_msg = "Złe poświadczenia";
      break;
    case 14:
      supla_status.status_msg = "Tymczasowo niedostępne";
      break;
    case 15:
      supla_status.status_msg = "Konflikt lokalizacji";
      break;
    case 16:
      supla_status.status_msg = "Konflikt kanałów";
      break;
    case 17:
      supla_status.status_msg = "Zarejestrowany i gotowy";
      break;
    case 18:
      supla_status.status_msg = "Urządzenie jest rozłączone";
      break;
    case 19:
      supla_status.status_msg = "Lokalizacja jest wyłączona";
      break;
    case 20:
      supla_status.status_msg = "Przekroczono limit urządzeń";
  }

  static int lock;
  if (status == 17 && configModeESP == normal) {
    supla_led_blinking_stop();
    lock = 0;
  }
  else if (status != 17 && lock == 0 && configModeESP == normal) {
    supla_led_blinking(500);
    lock = 1;
  }

  if (supla_status.old_status_msg != supla_status.status_msg) {
    supla_status.old_status_msg = supla_status.status_msg;
    supla_status.status = status;
  }
}
plik SuplaConfigESP.h

Code: Select all

#ifndef SuplaConfigESP_h
#define SuplaConfigESP_h

typedef struct {
  int status;
  String status_msg;
  String old_status_msg;
} _supla_status;

class SuplaConfigESP {
  public:
    SuplaConfigESP(void);

  private:
	void status_func(int status, const char *msg);
    _supla_status supla_status;
};

#endif //SuplaConfigESP_h
Przy próbie kompilacjid dostaję błąd:

Code: Select all

ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.  Say '&SuplaConfigESP::status_func' [-fpermissive]

gdy zrobię tak:
SuplaDevice.setStatusFuncImpl(&SuplaConfigESP::status_func);
to dostaję błąd:

Code: Select all

Arduino:1.8.12 (Windows Store 1.8.33.0) (Windows 10), Płytka:"Generic ESP8266 Module, 80 MHz, Flash, Legacy (new can return nullptr), Basic SSL ciphers (lower ROM use), dtr (aka nodemcu), 26 MHz, 40MHz, DOUT (compatible), 1MB (FS:64KB OTA:~470KB), 2, nonos-sdk 2.2.1+100 (190703), v2 Higher Bandwidth, Disabled, None, Only Sketch, 256000"

sketch\SuplaConfigESP.cpp: In constructor 'SuplaConfigESP::SuplaConfigESP()':

SuplaConfigESP.cpp:25:61: error: no matching function for call to 'SuplaDeviceClass::setStatusFuncImpl(void (SuplaConfigESP::*)(int, const char*))'

   SuplaDevice.setStatusFuncImpl(&SuplaConfigESP::status_func);

                                                             ^

sketch\SuplaConfigESP.cpp:25:61: note: candidate is:

In file included from sketch\SuplaConfigManager.h:63:0,

                 from sketch\SuplaConfigESP.cpp:18:

C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice/SuplaDevice.h:305:8: note: void SuplaDeviceClass::setStatusFuncImpl(_impl_arduino_status)

   void setStatusFuncImpl(_impl_arduino_status impl_arduino_status);

        ^

C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice/SuplaDevice.h:305:8: note:   no known conversion for argument 1 from 'void (SuplaConfigESP::*)(int, const char*)' to '_impl_arduino_status {aka void (*)(int, const char*)}'

exit status 1
no matching function for call to 'SuplaDeviceClass::setStatusFuncImpl(void (SuplaConfigESP::*)(int, const char*))'
https://gui-generic-builder.supla.io/
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

SUPLA.... Nareszcie w domu.
miko1282
Posts: 561
Joined: Wed Dec 06, 2017 10:15 pm
Location: Brodnica
Has thanked: 1 time

Post

Supla jest w c++ ? Można sobie firmware tworzyć i wgrać do esp (w c++)?
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

Nie doczytałem. Myślałem, że chcesz utworzyć wskaźnik to metody w swojej klasie. Przykłady wskaźników na funkcje masz w przykładach.
SUPLA.... Nareszcie w domu.
User avatar
lesny8
Posts: 3132
Joined: Mon Dec 11, 2017 9:43 pm
Has thanked: 10 times
Been thanked: 9 times

Post

miko1282 wrote: Sun Mar 08, 2020 2:13 pm Supla jest w c++ ? Można sobie firmware tworzyć i wgrać do esp (w c++)?
W C++ jest biblioteka rozwojowa pod Arduino IDE, branch develop na suplowym githubie. Szkice tworzysz w C++
Natomiast w C jest natywna biblioteka pod SDK Espressifa
SOP 2023 :heavy_check_mark:
SOP 2024 :heavy_check_mark:
Czekam na kolejne Supla Offline Party :upside_down_face:
🧩: 🔑cz->b ⛴️+ila
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

pzygmunt wrote: Sun Mar 08, 2020 3:01 pm Nie doczytałem. Myślałem, że chcesz utworzyć wskaźnik to metody w swojej klasie. Przykłady wskaźników na funkcje masz w przykładach.
Cyba nie znalazłem pomocnych mi przykładów :) Poległem na prostej rzeczy więc aby jakoś obejść brak wiedzy zrobiłem tak:

metodę void SuplaConfigESP::status_func(int status, const char *msg) wyrzuciłem poza klasę SuplaConfigESP, wtedy SuplaDevice.setStatusFuncImpl(&status_func) działa i program się kompiluje.
https://gui-generic-builder.supla.io/
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

@pzygmunt podał dobry przykład, a konkretniej to tutaj: https://isocpp.org/wiki/faq/pointers-to ... r-vs-fnptr

Kluczowe jest pierwsze zdanie: "Don't." :)

Status niedługo też wyleci w nowej bibliotece do osobnej klasy i nie będzie już callbacka.
Najlepsze suple dla Twojego domu :mrgreen:
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

klew wrote: Sun Mar 08, 2020 10:18 pm @pzygmunt podał dobry przykład, a konkretniej to tutaj: https://isocpp.org/wiki/faq/pointers-to ... r-vs-fnptr

Kluczowe jest pierwsze zdanie: "Don't." :)
Nie ma jak zacząć od przykładów których nie używać a później dopiero zrozumieć swój błąd :)
klew wrote: Sun Mar 08, 2020 10:18 pm Status niedługo też wyleci w nowej bibliotece do osobnej klasy i nie będzie już callbacka.
Mam nadzieję, że przebudowując "nowe" stare funkcjonalności uwzględnisz problem:
viewtopic.php?p=63935#p63935

Nie chciałbym rozbijać plików na *.cpp oraz *.h funkcji które mnie interesują z oficjalnej biblioteki :)
https://gui-generic-builder.supla.io/
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

krycha88 wrote: Mon Mar 09, 2020 8:49 am Mam nadzieję, że przebudowując "nowe" stare funkcjonalności uwzględnisz problem:
viewtopic.php?p=63935#p63935

Nie chciałbym rozbijać plików na *.cpp oraz *.h funkcji które mnie interesują z oficjalnej biblioteki :)
Wszystkie pliki będą rozbite na cpp i h.

Część już nawet jest tak przerobiona, ale zacząłem od takich najbardziej wspólnych plików, które i tak zawsze są kompilowane.
Najlepsze suple dla Twojego domu :mrgreen:
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

klew wrote: Mon Mar 09, 2020 9:37 am
krycha88 wrote: Mon Mar 09, 2020 8:49 am Mam nadzieję, że przebudowując "nowe" stare funkcjonalności uwzględnisz problem:
viewtopic.php?p=63935#p63935

Nie chciałbym rozbijać plików na *.cpp oraz *.h funkcji które mnie interesują z oficjalnej biblioteki :)
Wszystkie pliki będą rozbite na cpp i h.

Część już nawet jest tak przerobiona, ale zacząłem od takich najbardziej wspólnych plików, które i tak zawsze są kompilowane.
Bardzo dobra wiadomość :)
https://gui-generic-builder.supla.io/

Return to “Pomoc”