Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 21:55


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 41 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 18 maja 2020, o 20:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

Witam mam problem ze zrozumieniem co tak naprawdę robi callback i jak działa..

Wzorowałem się na filmiku Mirka gra snake..

Rozumiem że dla pewnego wywołanego zdarzenia pojawia się jakiś ekran na LCD ale nie do końca rozumiem w jaki sposób to działa

Pojawiają się pewne funkcje :

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Rozumiem że to jest deklaracja funkcji - register_start_screen_callback - funkcja nie zwraca wyniku ale przyjmuje argument : ( void (*callback)(uint8_t usr_cnt) ) i nie do końca rozumiem ten zapis
w nawiasie co on znaczy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 maja 2020, o 21:05 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Odwołując się do poprzedniego wątku:
https://forum.atnel.pl/topic23136.html
callback to też wskaźnik, tylko tym razem nie na dane tylko na funkcję.
W pokazanym kodzie jest tylko rejestracja callbacka czyli przekazanie adresu do funkcji.
Chodzi np. o adres twojej funkcji która ma być wywołana z innej biblioteki.
Poszukaj w innym miejscu programu/biblioteki musi być jeszcze wywołanie tej funkcji w tym przypadku start_screen_callback().

------------------------ [ Dodano po: 1 minucie ]

AKSELINEK napisał(a):
Rozumiem że to jest deklaracja funkcji - register_start_screen_callback - funkcja nie zwraca wyniku ale przyjmuje argument : ( void (*callback)(uint8_t usr_cnt) ) i nie do końca rozumiem ten zapis
w nawiasie co on znaczy

W którym nawiasie tam są trzy?

------------------------ [ Dodano po: 6 minutach ]

register_start_screen_callback to nazwa funkcji
1 nawias to tak jak w każdej funkcji nawias zawierający argumenty przekazywane do funkcji.
2 nawias to pierwszy parametr w tym przypadku *callback czyli wskaźnik na funkcję,
a ponieważ jest to funkcja to musi mieć podany parametr, stąd:
3 nawias - zawierający argument do funkcji callback zgodnie z deklaracją:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Ostatnio edytowano 18 maja 2020, o 21:22 przez auers, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 maja 2020, o 21:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

Nie mogę dostrzec może coś nie przepisałem z poradnika :(

Ale pomimo to nie rozumiem w/w zapisu :

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


to ja rozumowałem że start_screen_callback to zmienna a nie funkcja???? Jak mam na to patrzeć

Druga sprawa w odpowiedzi:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Gdzie znajdę deklaracje w/w wskaznika *callback :| Bo jak zrozumiałem z poprzedniego postu powinien być przed *callback typ i nie bardzo wiem gdzie go znajdę??

A może podrzuć jakiś prostszy przykład zrozumienia callbacka z kompletnymi zapisami bo może coś po drodze przepisywania zgubiłem??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 maja 2020, o 21:33 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Jest to zmienna typu wskaźnik na funkcję.
Używasz jej później jak zwykłej funkcji.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Ta linijka przypisuje do niej adres funkcji który był podany jako argument w funkcji rejestrującej callback.
Poszukaj w programie linijki która wywołuje funkcję rejestrującą coś takiego:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Teraz adres tej: jakas_funkcja jest przypisany do start_screen_callback;
Później wywołując:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
faktycznie wykonuje się: jakas_funkcja(jakis_argument);.

AKSELINEK napisał(a):
Druga sprawa w odpowiedzi:
Gdzie znajdę deklaracje w/w wskaznika *callback Bo jak zrozumiałem z poprzedniego postu powinien być przed *callback typ i nie bardzo wiem gdzie go znajdę??


Jest podany w funkcji register_start_screen_callback jako argument czyli w nawiasie.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 maja 2020, o 22:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

No dobrze ale podpowiedz dokładniej co znaczy cały zapis w nawiasie ?
-Raz nie rozumiem co robi void znaczy nie zwraca wyniku???
- Dwa jak są dwa różne wyrażenia w dwóch nawiasach to jak to mam interpretować argument (*callback) a (uint8_t usr_cnt) chodzi mi o to jak mam rozumieć takie złożenie dwóch nawiasów, to są dwa
różne argumenty czy one tworzą jakąś jedną całość?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 maja 2020, o 07:56 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Całość należy traktować jako jeden wskaźnik na funkcję.
Z czego void wskazuje jaką wartość zwraca funkcja callback, tu nic.
(*callback) to nazwa funkcji/wskaźnika na funkcję, (uint8_t usr_cnt) to argumenty przekazywane do funkcji callback.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 maja 2020, o 17:25 
Offline
Użytkownik

Dołączył(a): 13 mar 2013
Posty: 123
Pomógł: 1

Może tak:
1. Każdą funkcję której chcemy użyć w swoim programie możemy wywołać na różne sposoby - albo podać jej nazwę albo wskazać miejsce w pamięci w którym jest zapisana. Ten drugi sposób realizujemy w ten sposób ,że piszemy gwiazdkę (operator wyłuskania) i za nim wskaźnik miejsca w którym się dana funkcja znajduje - inaczej mówiąc kompilator widząc gwiazdkę i znajdujący się za nim adres skacze pod ten adres i realizuje to co się pod tym adresem znajduje.
2.Wyobraźmy sobie iż chcemy wywołać w programie jakąś funkcję której w danym momencie nie możemy jeszcze jednoznacznie określić . Przykładowo: mamy dwa rodzaje silników krokowych o różnych konstrukcjach. Każdy z nich wymaga do obsługi nieco innej funkcji a my jeszcze nie wiemy jaki silnik odbiorca programu zastosuje. Piszemy więc na wszelki wypadek dwie funkcje - każdą dla innego motorka. No ale tu pojawia się problem którą funkcję mamy wywołać? I tu przydaje się mechanizm callback.
3.Tworzymy jakiś pusty wskaźnik który jeszcze nic nie wskazuje i używamy go w naszym programie tak jakby wskazywał już jakąś konkretną funkcję. Kompilator , choć z natury bystry w momencie kompilacji nie wie co będzie wywoływał - wskaźnik to wskaźnik po prostu adres pod który trzeba skoczyć i tyle. Tak więc program jest tworzony jak by za tym wskaźnikiem kryła się jakaś funkcja , bez sprawdzania jaka. Reasumując w trakcie wykonywania programu wywołujemy nie konkretną funkcję lecz ten nasz nowoutworzony wskaźnik.
4.Taraz w innym miejscu programu gdy już wiemy którego motorka użyjemy możemy sprecyzować którą z naszych dwóch napisanych wcześniej funkcji mamy wykorzystać. Ponieważ każda z tych funkcji ma też swój adres, określany za pomocą jej wskaźnika więc najprościej po prostu przypisać wskaźnik odpowiedniej funkcji do tego pustego wskaźnika który wywołujemy w trakcie działania programu. Do tego celu właśnie służy funkcja register. Przypisuje ona nasz pusty, nowoutworzony wskaźnik do wskaźnika konkretnej funkcji. Inaczej mówiąc wywołanie tego pustego wcześniej wskaźnika po przypisaniu jest równoważne wywołaniu konkretnej już funkcji.
5.Kwestia zapisu - dlaczego tyle nawiasów przy funkcji register. Jeśli mówimy o wskaźniku do jakiejś funkcji , nie jest on dowolny- w określeniu wskaźnika oprócz gwiazdki która mówi ,że mamy do czynienia ze wskaźnikiem , nazwy wskaźnika w nawiasach (która jest identyczna z gołą nazwą funkcji,bez argumentów) musimy podać w kolejnych nawiasach argumenty z jakimi ta funkcja będzie wywoływana. Stąd tyle nawiasów. Reasumując:
a.gwiazdka - mamy do czynienia ze wskaźnikiem
b.nawiasy zawierające nazwę - mówią o tym iz mamy do czynienia ze wskaźnikiem na funkcję (bez nazwiasów byłby wskaźnik na zmienną)
c.w nawiasach nazwa wskaźnika
d.kolejne nawiasy zawierające wszyskie argumenty z którymi będzie wywoływana funkcja na którą wskazujemy
e.lista wszystkich argumentów wywoływanej funkcji.
6.Realizacja. Aby program działał musimy najpierw wywołac w czasie inicjalizacji programu funkcję register i przypisać do naszego pustego wskaźnika konkretną funkcję.
W trakcie programu (na co Mirek zwraca szczególna uwagę) należy najpierw sprawdzić czy to przypisanie zostało zrealizowane ( czy przypadkiem nasz wskaźnik nie pozostał pusty) i dopiero potem realizujemy jego wywołanie.
Przy okazji - mechanizm callback pozwala na zmianę przypisania funkcji w trakcie programu. Inaczej mówiąc gdybyśmy jednocześnie używali obu silników, to zmieniając niejako "w locie" przypisane funkcje moglibyśmy sterować raz jednym silnikiem a raz drugim



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 maja 2020, o 19:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2019
Posty: 147
Pomógł: 37

MisterWhite napisał(a):
b.nawiasy zawierające nazwę - mówią o tym iz mamy do czynienia ze wskaźnikiem na funkcję (bez nazwiasów byłby wskaźnik na zmienną)

Nie. Nawiasy obejmujące wskaźnik są konieczne ponieważ operator wyłuskania (gwiazdka) ma niższy priorytet niż operator nawiasowy (w tym przypadku oznaczający wywołanie funkcji).
int (*fun)(void) - fun jest wskaźnikiem na funkcję zwracającą typ int,
int *fun(void) - fun jest funkcją zwracającą wskaźnik na typ int

_________________
Think for yourself and question authority.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 13:35 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

Mam pytanie
Collback to funkcja za pomocą której wywołujemy inną funkcję
Tak to rozumiem
teraz pytanie czemu nie wywoływać drugiej funkcji w ten sposób

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Pytanie 2
gdzie ma zastosowanie wywołanie funkcji za pomocą funkcji



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 14:13 
Offline
Użytkownik

Dołączył(a): 14 sie 2016
Posty: 905
Pomógł: 39

Wyobraź sobie, że masz program który coś tam sobie robi i wykonuje jakąś tam dodatkową funkcję, ale w zależności od np jakiejś zmiennej ta funkcja mu się zmienia, wtedy wystarczy zmienić tylko twojego callbacka i hula sobie dalej.

_________________
Moje porady są błędne,nie czytać,zbanować od razu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 14:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2019
Posty: 147
Pomógł: 37

miki53 napisał(a):
pytanie czemu nie wywoływać drugiej funkcji w ten sposób


A dlaczego nie? Callbacki w HAL STM32 właśnie tak są wywoływane.

_________________
Think for yourself and question authority.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 14:31 
Offline
Użytkownik

Dołączył(a): 14 sie 2016
Posty: 905
Pomógł: 39

A jak chcesz zmienić wywoływaną funkcję w trakcie działania programu?

_________________
Moje porady są błędne,nie czytać,zbanować od razu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 17:06 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

miki53 napisał(a):
Mam pytanie
Callback to funkcja za pomocą której wywołujemy inną funkcję
Tak to rozumiem
teraz pytanie czemu nie wywoływać drugiej funkcji w ten sposób

Bo tu nie do końca chodzi o samo wywołanie jednej funkcji przez drugą.
Wywołując "na sztywno" funkcję tak jak zaproponowałeś musisz już ją mieć w momencie pisania np. biblioteki i tego już w trakcie wykonywania programu nie zmieniasz.
Idea callbacka jest taka, że pisząc bibliotekę nie zastanawiasz się jaką konkretnie funkcję będziesz wywoływał. Masz po prostu wywołać jakąś funkcję i może to być dowolna funkcja a na dodatek w trakcie programu mogą one być zmieniane.
Najprostszy przykład to biblioteki do obsługi enkodera lub przycisków.
Wciśnięcie przycisku, raz może wywoływać menu, kiedy indziej zatwierdzać wpisane dane, a jeszcze innym razem np. potwierdzić przyjęcie alarmu lub uruchomić jakieś urządzenie. I to ten sam przycisk w różnych miejscach jednego programu.
Mając bibliotekę z callbackiem, nie modyfikujesz jej za każdym razem pod konkretny program, piszesz ją raz, uniwersalnie a potem tylko w programie rejestrujesz funkcję którą chcesz wykonywać jako callback i biblioteka robi/wywołuje to co chcesz, bez modyfikacji.

------------------------ [ Dodano po: 16 minutach ]

fofex napisał(a):
miki53 napisał(a):
pytanie czemu nie wywoływać drugiej funkcji w ten sposób


A dlaczego nie? Callbacki w HAL STM32 właśnie tak są wywoływane.

Samo wywołanie funkcji przecież i tu też jest identyczne.
Zmieńcie sobie nazwę callback na funkcja_2 i właśnie tak się będzie ją wywoływało. Istotą nie jest samo wywołanie, tylko to, że trzeba najpierw pod ten callback, albo funkcja_2 podstawić adres funkcji którą chcemy wywołać i to robią funkcje register_callback, ale jak ktoś nie chce wywoływać tej funkcji i mu łatwiej to zrozumieć to może w programie na sztywno przypisać callback=nowa_funkcja; i też będzie działać, tylko trzeba jeszcze upublicznić deklarację wskaźnika (*callback).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 19:13 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

Jak działa callback

auers napisał(a):
Wciśnięcie przycisku, raz może wywoływać menu, kiedy indziej zatwierdzać wpisane dane, a jeszcze innym razem np. potwierdzić przyjęcie alarmu lub uruchomić jakieś urządzenie. I to ten sam przycisk w różnych miejscach jednego programu.


Taki mechanizm ja robię za pomocą warunków if
Jak w callback można zmieniać funkcje, które będą odpowiadały za zmianę działania przycisku i to podczas działania
programu ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 19:29 
Offline
Użytkownik

Dołączył(a): 14 sie 2016
Posty: 905
Pomógł: 39

miki53 napisał(a):
Jak w callback można zmieniać funkcje, które będą odpowiadały za zmianę działania przycisku i to podczas działania
programu ?

Rejestrujesz na nowo za każdym razem, kiedy tylko potrzebujesz.

_________________
Moje porady są błędne,nie czytać,zbanować od razu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 19:50 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

miki53 napisał(a):
Taki mechanizm ja robię za pomocą warunków if

I za każdym razem musisz edytować bibliotekę lub funkcję do obsługi klawisza, a dzięki callback'om możesz mieć jedną uniwersalną funkcję której nie ruszasz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 20:21 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

Można prosić o przykład, jak to by wyglądało w kodzie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 20:56 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

miki53 napisał(a):
Można prosić o przykład, jak to by wyglądało w kodzie

Macie najprostszy przykład jaki przyszedł mi do głowy:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Funkcja do przycisków blokująca i nie najlepsza, ale nie to było tematem.
Same callbacki również w sposób uproszczony bez funkcji rejestrującej, przypisane bezpośrednio, ale może łatwiej będzie załapać o co w nich chodzi.
Funkcje do rejestrowania callbacków robią to samo bez udostępniania samego wskaźnika.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 21:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

AKSELINEK napisał(a):
Bardzo dziękuję za zainteresowanie tematem . Ja jednak żeby sobie nie namieszać spróbuję pytać w odpowiedzi na moje pytanie po kolei czego nie rozumiem...

------------------------ [ Dodano po: 3 minutach ]

auers napisał(a):
Odwołując się do poprzedniego wątku:
https://forum.atnel.pl/topic23136.html
callback to też wskaźnik, tylko tym razem nie na dane tylko na funkcję.
W pokazanym kodzie jest tylko rejestracja callbacka czyli przekazanie adresu do funkcji.
Chodzi np. o adres twojej funkcji która ma być wywołana z innej biblioteki.
Poszukaj w innym miejscu programu/biblioteki musi być jeszcze wywołanie tej funkcji w tym przypadku start_screen_callback().
[/quote]

W odniesieniu do pytania o funkcję:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


calback to wskażnik i wskazuje na funnkcję :

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


faktycznie i widzę deklarację tej funkci wyżej:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


w tym miejscu jest brak mojej wiedzy w technicznej stronie wstawiania w taki sposób nawiasów i czy można to interpretować jak np?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


bo taka techniczna strona wstawiania różnych argumentów do funkcii jest mi znana i czy to znaczy to samo??

Prosze mi podpowiedzieć bo tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to deklaracja wskażnika na funkcję a
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to zwykła zmienna , co znaczy złóżenie
w taki sposób dwóch nawiasów z różnymi argumentami?

i co robi tutaj ta zmienna :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jak ten zapis zrozumiem to się zapytam o dalszą część... :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 21:36 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

AKSELINEK napisał(a):
w tym miejscu jest brak mojej wiedzy w technicznej stronie wstawiania w taki sposób nawiasów i czy można to interpretować jak np?
Kod:
static void (*start_screen_callback , uint8_t usr_cnt);

bo taka techniczna strona wstawiania różnych argumentów do finkci jest mi znana i czy to znaczy to samo??

No nie (*start_screen_callback) potraktuj jak nazwę funkcji.
Jak deklarujesz funkcję to za jej nazwą dopiero otwierasz nawias z argumentami. Tu jest tak samo tylko dodatkowo dajesz w nawias nazwę funkcji z gwiazdką która czyni z tej nazwy wskaźnik.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 21:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

auers napisał(a):
Całość należy traktować jako jeden wskaźnik na funkcję.
Z czego void wskazuje jaką wartość zwraca funkcja callback, tu nic.
(*callback) to nazwa funkcji/wskaźnika na funkcję, (uint8_t usr_cnt) to argumenty przekazywane do funkcji callback.


czyli *start_screen_callback to funkcja wskaznik na funkcje a (uint8_t usr_cnt) to przekazane do niej argumenty???
Podpowiedz co w w/w przykładzie znaczy ta zmienna to może rozjaśni po kolei zasadę działania



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 21:47 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Jeszcze raz, bo twój post się pojawiał na raty i odpisałem zanim ujawnił się w całości.
Zapis:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
jest niepoprawny.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Cytuj:
to deklaracja wskażnika na funkcję
TAK.
Cytuj:
co robi tutaj ta zmienna :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Mówi jakie argumenty będzie przyjmowała funkcja/wskaźnik.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 21:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

No teraz zrozumiałem na czym polega zapis z tymi nawiasami ;) ale teraz może podpowiedz jaki schemat działania?

Czyli jest sobie w pętli głównej funkcja:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


display_init - to zrozumiała dla mnie funkcja wyświetlająca jakiś ekran la lcd i ta funkcja nie zwraca wyniku tylko coś tam wyświetla ?

no dobra to jak to działa pojawia się odpowiednia dla zadziałania wartość (uint8_t usr_cnt) nie ważne co oznacza...
I co dalej zgodnie z deklaracją:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


wrzucana jest jako argument do funkcji wskaznikowej callback

i funkcja
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
w tym wyrażeniu przyjmuje wartość wskażnika callback



Ostatnio edytowano 20 maja 2020, o 22:19 przez AKSELINEK, łącznie edytowano 6 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 21:54 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

AKSELINEK napisał(a):
auers napisał(a):
Całość należy traktować jako jeden wskaźnik na funkcję.
Z czego void wskazuje jaką wartość zwraca funkcja callback, tu nic.
(*callback) to nazwa funkcji/wskaźnika na funkcję, (uint8_t usr_cnt) to argumenty przekazywane do funkcji callback.


czyli *start_screen_callback to funkcja wskaznik na funkcje a (uint8_t usr_cnt) to przekazane do niej argumenty???
Podpowiedz co w w/w przykładzie znaczy ta zmienna to może rozjaśni po kolei zasadę działania

No powoli zaczynasz to rozumieć.
Co to są za argumenty: jakiś licznik typu uint8_t. Obejrzyj jeszcze raz poradnik na pewno Mirek o tym mówił, ja nie pamiętam, ale z nazwy wynika że albo licznik graczy, albo pkt'ów gracza.

------------------------ [ Dodano po: 2 minutach ]

Cytuj:
ale teraz może podpowiedz jaki schemat działania?
Nie bardzo łapię o co pytasz.
Przyjrzyj się temu programowi co napisałem na prośbę miki53. Może on Ci jeszcze coś rozjaśni.

------------------------ [ Dodano po: 21 minutach ]

AKSELINEK napisał(a):
display_init - to zrozumiała dla mnie funkcja wyświetlająca jakiś ekran la lcd i ta funkcja nie zwraca wyniku tylko coś tam wyświetla ?

no dobra to jak to działa pojawia się odpowiednia dla zadziałania wartość (uint8_t usr_cnt)

register_start_screen_callback tylko rejestruje tą funkcję jezszcze jej nie wywołuje.
Wywołanie jest gdzie indziej i tam na pewno jest już wywołanie z argumentem w nawiasie np:
start_screen_callback(1);
lub np. z jakąś zmienną np:
start_screen_callback(cnt);



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 22:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

muszę dokładniej oglądnąć poradnik bo nie widzę jak pisałeś wyżej wywołania funkcji start_screen_callback().
widzę jedynie taki zapis :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 22:46 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Jeszcze raz Ci rozpiszę jak to działa w tym przykładzie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Tu adres funkcji display_init jest przekazywany do funkcji register_start_screen_callback jako argument.
W funkcji register_start_screen_callback argument jest używany pod nazwą callback
Czyli adres funkcji: display_init jest przekazany do zmiennej callback
teraz w ciele funkcji w lini:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

adres funkcji display_init jest przekazany ze zmiennej/argumentu callback do docelowego wskaźnika start_screen_callback
Natomiast samo wywołanie funkcji display_init jest już w innym miejscu przez użycie wskaźnika/callbacka start_screen_callback z argumentem typu uint8_t np tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Przejrzyj jeszcze raz poradnik, to musi tam być.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 22:49 
Offline
Użytkownik

Dołączył(a): 14 sie 2016
Posty: 905
Pomógł: 39

Gdzieś pod poradnikiem są nawet kody do pobrania ;)

------------------------ [ Dodano po: 2 minutach ]

A dokładnie tu http://mirekk36.blogspot.com/2012/12/ws ... a-bez.html

_________________
Moje porady są błędne,nie czytać,zbanować od razu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2020, o 23:07 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Harry napisał(a):
Gdzieś pod poradnikiem są nawet kody do pobrania ;)

------------------------ [ Dodano po: 2 minutach ]

A dokładnie tu http://mirekk36.blogspot.com/2012/12/ws ... a-bez.html

Dokładnie, a teraz sprawdź linie nr 93 w pliku snake c.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 maja 2020, o 07:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

Bardzo dziękuję za podpowiedz i poświęcony mi czas myśle że mam już tak dużo cennych wskazówek i podpowiedzi ze już sobie to na spokojnie przeanalizuje



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 maja 2020, o 20:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

Jeszcze na koniec poskładałem do kupy w/w funkcje i teraz podpowiedz mi na koniec jak wywołać display_init?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


To na przykładzie może pójdzie mi łatwiej tylko jak wywołać display_init a jak bym chciał wywołać jakiś inny ekran to jak to dalej zrobić??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 41 ]  Przejdź na stronę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 10 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO