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



Teraz jest 28 mar 2024, o 12:25


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
Autor Wiadomość
PostNapisane: 26 lis 2014, o 19:51 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 47
Pomógł: 1

Witam.
Mam pytanie na temat funkcji służącej do obsługi klawiszy napisanej przez Pana Mirka:

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


Czy można przy jej pomocy wywołać funkcję do której przekazujemy wskaźnik np:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


lub ogólnie jakąś zmienną?

Funkcje bez argumentów potrafię przekazać, ale jak po wciśnięciu przycisku zmienić wartość jakiejś zmiennej, która nie jest globalna?
Dziękuję za ewentualne odpowiedzi i pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lis 2014, o 20:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Wystarczy zmienić nagłówek funkcji np. 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.

W miejscu wywołania funkcji z parametrem można użyć następującego kodu:

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

Ten zapis jest dość ciekawy ;) :

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

Zapewne chodziło o "++*wsk" lub "(*wsk)++".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 17:40 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 47
Pomógł: 1

No tak. Wcześniej było to zapisane jako *wsk+=1, potem zmieniłem na *wsk++, a jedynka się zaplątała po drodze.

Wszystko fajnie, ale nie rozumiem za co odpowiada "*var". Co mam tam przekazać wywołując funkcję obsługi klawisza?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 17:41 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

Anysiu68 napisał(a):
Wszystko fajnie, ale nie rozumiem za co odpowiada "*var". Co mam tam przekazać wywołując funkcję obsługi klawisza?

a poczytał kolega o wskaźnikach w Bluebooku czy nie ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 19:36 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 47
Pomógł: 1

Czytałem kilka razy i wiem jak one działają. Pytam do czego służy ten wskaźnik w tym konkretnym przypadku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 21:07 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

Anysiu68 napisał(a):
Czytałem kilka razy i wiem jak one działają. Pytam do czego służy ten wskaźnik w tym konkretnym przypadku.


aaa ... no pytasz co masz przekazać do funkcji - widzisz jak zadawałeś pytanie to myślałem że ty wiesz co chcesz przekazać - a jeśli ty nie wiesz to kto ma wiedzieć ?

wskaźnik jako argument bywa przydatny ponieważ można przekazać przez niego WSZYSTKO. Adres zmiennej, struktury, tablicy - czego zechcesz ... ale to ty musisz zdecydować czyli wymyślić najpierw co będziesz chciał przekazać - jakiś cel - rozumiesz ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 22:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Może to mało edukacyjne z mojej strony, ale skoro przedstawiłem takie rozwiązanie to muszę je wytłumaczyć ;)

Parametr "var" to wskaźnik na zmienną, która ma być później (wg przedstawionej funkcji Kolegi) inkrementowana.
Będzie to po prostu argument przekazywany jako parametr dla funkcji "funkcja", która jest przekazywana jako wskaźnik do niej w parametrze "kfun".

Funkcje zwrotne (callback'i) są bardzo przydatną sprawą, ale w tym wypadku zamiast używać wskaźnika na funkcję można od razu inkrementować zmienną w miejscu wywołania funkcji "kfun". Jednak nie polecam tego sposobu, bo wymaga to ingerencji w kod biblioteki lub utworzenia bliźniaczej funkcji (chcąc wykorzystywać obie wersje).


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2014, o 13:15 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 47
Pomógł: 1

atmel napisał(a):

Parametr "var" to wskaźnik na zmienną, która ma być później (wg przedstawionej funkcji Kolegi) inkrementowana.


Dzięki wielkie. Teraz wszystko jasne. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2014, o 19:24 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 47
Pomógł: 1

A jednak to nie koniec moich pytań. Wszystko działa tak jak chciałem, ale pojawił się problem "w drugą stronę" Co jeśli do takiej funkcji:
atmel napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

będę chciał przekazać funkcję void funkcja(void) i nie przekazywać argumentu var? Czy do tego potrzebuję dwóch osobnych funkcji key_press? np.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

oraz
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: 28 lis 2014, o 22:08 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 47
Pomógł: 1

Ale wtedy krzyczy, że brakuje mu parametru.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2014, o 22:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

W przypadku C++ można by było skorzystać z przeciążenia funkcji, bądź też parametrów domyślnych, ale dla C można np. utworzyć funkcję "bazową":

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

...oraz drugą, która będzie jedynie "nakładką" na już istniejącą funkcję:

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: 11 lut 2017, o 21:06 
Offline
Użytkownik

Dołączył(a): 19 gru 2012
Posty: 712
Lokalizacja: Opole
Pomógł: 23

Sorry za odkopywanie tematu ale mam spory problem z przerobieniem tej funkcje. Otóż zamieniłem funkcje key_press według rad kolegów na:

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


Teraz wywołuję funkcję key_press za pomocą kodu:

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


Gdzie za liczbę 5 podstawiać będę różne uint8_t

Funkcja pokaz_ekran na chwile obecną do testów wygląda tak:

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



Niestety w wyniku takiego kodu otrzymuje błąd kompilacji:
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: 11 lut 2017, o 21:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Wilu88 napisał(a):
too few arguments to function 'key_press'

Zbyt mało argumentów w funkcji key_press.

Funkcja ta posiada pięć argumentów, a ty wywołujesz ją tylko z czterema. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2017, o 21:28 
Offline
Użytkownik

Dołączył(a): 19 gru 2012
Posty: 712
Lokalizacja: Opole
Pomógł: 23

anshar napisał(a):
Wilu88 napisał(a):
too few arguments to function 'key_press'

Zbyt mało argumentów w funkcji key_press.

Funkcja ta posiada pięć argumentów, a ty wywołujesz ją tylko z czterema. ;)


Sorry za zawracanie głowy to chyba przez ilość godzin :P Wszystko już jasne i poprawione :)



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: 14 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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