Skocz do zawartości

Pomocna odpowiedź

Napisano

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);

 

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.

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;
}

 

(edytowany)

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
(edytowany)

A metody static nie tracą przypadkiem dostepu do zmiennych z danej klasy które nie są static? 

Edytowano przez Dantey

@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().

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. 

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.

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? 

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...