Jak przekazać wskaźnik do funkcji

krycha88
Posty: 690
Rejestracja: pt lis 16, 2018 7:25 am

ndz mar 08, 2020 9:58 am

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

Przykładowy kod:

plik SuplaConfigESP.cpp

Kod: Zaznacz cały

#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

Kod: Zaznacz cały

#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:

Kod: Zaznacz cały

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:

Kod: Zaznacz cały

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*))'
miko1282
Posty: 423
Rejestracja: śr gru 06, 2017 10:15 pm
Lokalizacja: Brodnica

ndz mar 08, 2020 2:13 pm

Supla jest w c++ ? Można sobie firmware tworzyć i wgrać do esp (w c++)?
Awatar użytkownika
pzygmunt
Posty: 7979
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontaktowanie:

ndz 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.
Awatar użytkownika
lesny8
Posty: 1045
Rejestracja: pn gru 11, 2017 9:43 pm

ndz mar 08, 2020 3:04 pm

miko1282 pisze:
ndz 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
Pomóżcie proszę choć odrobinę
https://pomagam.pl/af3hwf6c
krycha88
Posty: 690
Rejestracja: pt lis 16, 2018 7:25 am

ndz mar 08, 2020 5:02 pm

pzygmunt pisze:
ndz 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.
Awatar użytkownika
klew
Posty: 670
Rejestracja: czw cze 27, 2019 12:16 pm

ndz 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." :)

Status niedługo też wyleci w nowej bibliotece do osobnej klasy i nie będzie już callbacka.
krycha88
Posty: 690
Rejestracja: pt lis 16, 2018 7:25 am

pn mar 09, 2020 8:49 am

klew pisze:
ndz 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 pisze:
ndz 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 :)
Awatar użytkownika
klew
Posty: 670
Rejestracja: czw cze 27, 2019 12:16 pm

pn mar 09, 2020 9:37 am

krycha88 pisze:
pn 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.
krycha88
Posty: 690
Rejestracja: pt lis 16, 2018 7:25 am

pn mar 09, 2020 9:41 am

klew pisze:
pn mar 09, 2020 9:37 am
krycha88 pisze:
pn 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ść :)
ODPOWIEDZ