Skocz do zawartości

Callbacki do innych metod


Dantey

Pomocna odpowiedź

Witam, mam problem z zastosowaniem callbacka do metody z innego obiektu, dostaje błąd "wskaźnik do powiązanej funkcji może zostać użyty tylko do wywołania tej funkcji"

Kod wygląda mniej wiecej tak:

TypeButton Button;

typedef L298N *P_L298N;
P_L298N MotorA;
void setup() 
{
    Button.RegisterIddleCallback(MotorA->stop);
    Button.RegisterPressCallback(MotorA->forward);
}

TypeButton to biblioteka do obsługi guzika. Chce po prostu wywołać funkcje "jedź" gdy go wcisne, i stop gdy go puszczę. Próbowałem też nie przez wskaźnik, ale błąd jest ten sam. Czy jest to w ogole osiągalne, czy może powinienem zupełnie inaczej to napisać, choć nie ukryje że to byłby najwygodniejszy sposób. 

Wspomniane callbacki wyglądają tak: 

    typedef void (*Callback)(void);
    Callback ButtonPressed;
    Callback ButtonNotPressed;

    void RegisterPressCallback(Callback CallbackFun);
    void RegisterIddleCallback(Callback CallbackFun);

 

Link do komentarza
Share on other sites

Trochę się zgubiłem przy czytaniu. Łatwiej by było gdybyś pokazał choćby syntetyczny szkic tego, co chcesz zrobić, ale na tyle kompletny, by było widać co chcesz zrobić i móc spróbować skompilować i zobaczyć ten błąd. Bo nie widzę tu wspomnianej funkcji jedz(). Mogę zgadywać, ale tylko zgadywać, że być może temat, którego szukasz, to wskaźniki do metod. Bo jeżeli funkcja, której chcesz użyć, nie jest metodą statyczną klasy, to jakoś musi zostać dowiązana do konkretnego obiektu.

Link do komentarza
Share on other sites

Przepraszam, już uzupełniam reszte kodu. Mógłbyś mi jakoś łopatologicznie wytłumaczyć o co chodzi z metodą statyczną? Spotykałem się z tym ale nigdy nie zostało mi wytłumaczone czym są? 

ciało forward()



void L298N::forward()
{
  digitalWrite(_pinIN1, HIGH);
  digitalWrite(_pinIN2, LOW);

  analogWrite(_pinEnable, _pwmVal);

  _direction = FORWARD;
  _isMoving = true;
}

 

Link do komentarza
Share on other sites

A nie, w zasadzie widzę tu, co i jak. To taki przykład, wyjaśniający kodem:

#include <cstdio>

class X {
	int v;
public:
	X(int v) : v(v) {};
	static void statyczna();
	void niestatyczna();
};

void X::statyczna()
{
	std::puts("statyczna");
}

void X::niestatyczna()
{
	std::printf("niestatyczna, v = %d\n", v);
}

void (*statyczna_ptr)() = &X::statyczna;
void (X::*niestatyczna_ptr)() = &X::niestatyczna;

int main()
{
	(*statyczna_ptr)();

	X x(5);
	(x.*niestatyczna_ptr)();
}

Metody niestatyczne można wywoływać tylko na konkretnym obiekcie. Na samym końcu jest wywołanie takiego wskaźnika. Ale on wymaga, by również zapisać obiekt, którego chcesz użyć. Więc prościej może być zrobić funkcję pośrednią, motor_a_stop(), w niej MotorA->stop() i tę funkcję zapisać jako wywołanie zwrotne.

EDYCJA: pisane przed Twoją najnowszą odpowiedzią.

EDYCJA 2: A użyłem tu _ptr, co do naszej dawniejszej dyskusji, by w oczach nie myliło się co jest nazwą czego, bo bez problemu mógłbym nazwać te wskaźniki identycznie jak nazwy metod w klasie.

Edytowano przez trainee
  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@Dantey, widzisz? Czyli jednak wiesz. Statyczne nie mają dostępu do niestatycznych pól ani metod obiektu. Mogą być też wywołane nawet wtedy, gdy żaden obiekt klasy nie istnieje, np. klasa::statyczna(), zamiast obiekt.statyczna().

Link do komentarza
Share on other sites

Po przestudiowaniu problemu, rozwiązanie z funkcjami pośrednimi będzie najbardziej efektowne. W innym wypadku musiałbym połączyć te dwie biblioteki by umiały się odwołać wzajemnie do swoich metod z tego co wyczytałem... a to na pewno jest mało optymalne w tym wypadku. 

Link do komentarza
Share on other sites

26 minut temu, Dantey napisał:

W innym wypadku musiałbym połączyć te dwie biblioteki by umiały się odwołać wzajemnie do swoich metod z tego co wyczytałem...

Nie wydaje mi się, by ta droga mogła doprowadzić do celu.

Na zupełnym marginesie, gdzieś tam z tyłu głowy można mieć pytanie, czy Ty nie za bardzo kombinujesz w swoim konkretnym przypadku kodu, z zapisywaniem wskaźników do funkcji.

Link do komentarza
Share on other sites

Założeniem było mieć bilbliotekę "button" i chciałem po prostu przypisać działanie funkcji "motorForward" do guzika. A że mam zapisywanie działan guzika przez callback to jak mogłoby być inaczej? 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.