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



Teraz jest 7 lut 2025, o 18:10


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 21 paź 2012, o 22:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lip 2012
Posty: 203
Lokalizacja: Sosnowiec
Pomógł: 2

Witam

i wklejam rozmowę z bloga:

Ja:

Od paru dni analizuję ten kod i zawiesiłem się w miejscu:

register uint8_t key_press = (*btn->KPIN & btn->key_mask);

Panie Mirku proszę o rozrysowanie/wytłumaczenie jak to:
(*btn->KPIN & btn->key_mask);
sprawdza stan na pinie ?

Czytałem o wskaźnikach, ale w tak skomplikowanym zestawieniu * i & po prostu nie ogarniam.

Spodziewam się banalnego wytłumaczenia, niestety sam go nie wymyślę -poddaję się.

Mirekk36:

Już staram się pomóc ;) ... po pierwsze napisz mi czy analizowałeś najpierw przykłady z drugiej części artykułu - gdzie było to w prostszej wersji napisane - ponieważ korzystaliśmy wprost z argumentów przekazanych do funkcji. Wadą było wtedy to że tych argumentów musimy aż tyle targać do każdego wywołania. Dlatego przygotowaliśmy strukturę TBUTTON prawda ? to na razie jest jasne chyba ?

Więc do funkcji teraz przekazujemy tylko pięknie adres tej struktury &button , czyli wskaźnik tak na prawdę tak ? Bo użyliśmy operatora wyciągania adresu &

i teraz na wejściu do funkcji od razu chcemy wiedzieć czy wciśnięty jest klawisz. Ale nie piszemy tego tak

key_press = PINC & (1<key_mask;

to jest to samo dokładnie tyle że odwołujemy się do pól struktury. Twoją konsternację może budzić fakt że to nie jest zapisane np tak:

key_press = *btn.KPIN & btn.key_mask;

tylko jakieś strzałki są - ale zauważ że gdy odwołujemy się bezpośrednio do pól struktury to korzystamy z kropki, a gdy odwołujemy się do struktury przez wskaźnik ( u nas to jest btn ) ... to musimy zamiast kropek wpisać ->

teraz jaśniej ?

jeśli nie to pytaj śmiało dalej i męcz mnie - chętnie odpowiem


Oj NIESTETY ale blog nie nadaje się do dyskusji o KODZIE programu - wcina znaki niektóre i są błędy w tym co napisałem wyżej ... więc jak chcesz lepiej to dawaj na nasze forum:

http://www.forum.atnel.pl

i tam załóż wątek z tym pytaniem - i zobacz jak tam fajnie można pokazywać kody z kolorowaniem nawet składni - OK

-----------------------------koniec cytatów--------------------------------------------

Przepraszam że od razu nie pytałem tutaj ( uraz psychiczny z innych for - bałem się że w złym dziale napiszę).


Wracając do tematu, cześci 2 nie czytałem :O jak zwykle zaczynam od końca. (jutro to nadrobię)

co do -> wiem o co chodzi

(*btn->KPIN & btn->key_mask);
dopiero uczę się wskaźników i nie wiem w jakim kontekście jest w tym przykładzie użyta * gwiazdka
jako definicja wskaźnika ? raczej nie
i po co znak pobierania adresu & gdzie ten adres trafia co się z nim dzieje i jak ?
magia ! proszę o wyrozumiałość ;)

_________________
sig on ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 paź 2012, o 22:50 
Offline
Moderator
Avatar użytkownika

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

1bobik1 napisał(a):

(*btn->KPIN & btn->key_mask);
dopiero uczę się wskaźników i nie wiem w jakim kontekście jest w tym przykładzie użyta * gwiazdka
jako definicja wskaźnika ? raczej nie
i po co znak pobierania adresu & gdzie ten adres trafia co się z nim dzieje i jak ?
magia ! proszę o wyrozumiałość ;)


A powiedz mi - masz tę książkę ?

http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

bo od niej warto zacząć ....

i teraz zapamiętaj że:

jeśli * jest w definicji czyli:

Kod:
uint8_t *wsk;


to oznacza ona TYLKO definicję wskaźnika.

Ale jeśli jest w kodzie, np

Kod:
a = *wsk;


to gwiazdka oznacza że do a trafi to na co wskazuje wskaźnik czyli zawartość ;)

Natomiast tutaj:

Kod:
(*btn->KPIN & btn->key_mask);


znak & to nie jest broń BOŻE operator pobierania adresu - tylko zwykły operator bitowy ;)

w ogóle w C znaczek & występuje aż w 3 znaczeniach:

1. & operator pobierania adresu
2. & operator bitowy
3. && operator logiczny

no ale to są podstawy, których nie dam rady tak tłumaczyć na forum bo za dużo pisania - dlatego polecam tą książkę bo tam w niej masz te podstawy wyjaśnione ok ?

a potem możesz po jej przeczytaniu - zadawać już dodatkowe pytania ....

I u nas na forum nie musisz się niczego bać ;) jak widzisz - u nas nawet nie ma działu KOSZ ;) jak na elektrodzie .

_________________
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: 21 paź 2012, o 22:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lip 2012
Posty: 203
Lokalizacja: Sosnowiec
Pomógł: 2

Książkę mam i wertuję dział ze wskaźnikami
ale ten &....... niby tylko spacja a jaka różnica ;)

czyli w tym przypadku * wskazuje na zawartość btn->KPIN i btn->key_mask ?

moją analizę kodu można chyba porównać do pracy lodołamacza, przepraszam za moje pytania, naprawdę chcę to zrozumieć, być może przeceniam waszą cierpliwość ale zaryzykuję

_________________
sig on ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 paź 2012, o 23:02 
Offline
Moderator
Avatar użytkownika

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

1bobik1 napisał(a):
Książkę mam i wertuję dział ze wskaźnikami

Oj - ale to musisz uważać - tej książki nie można czytać na wyrywki bo mało ci ona pomoże. Pisałem ją w bardzo specyficzny sposób - przemycając kawałki wiedzy porozrzucane wprawdzie ale tak aby po kolei się w głowie to w całość układało. A każdy kto czytał na wyrywki - zwykle się poddał w końcu ... uwierz mi ... albo popytaj ludzi na forum - że warto ją przynajmniej RAZ - chociaż JEDEN RAZ najpierw od deski do deski przeczytać tak na sucho

bo już teraz widzę że brniesz w złą stronę


1bobik1 napisał(a):
ale ten &....... niby tylko spacja a jaka różnica ;)


Bo widzisz tu żadna spacja nie gra roli - a kontekst zastosowania tego operatora, mogłoby być i bez żadnej spacji

1bobik1 napisał(a):
czyli w tym przypadku * wskazuje na zawartość btn->KPIN i btn->key_mask ?


no dokładnie * powoduje że wyciągamy zawartość wskaźnika - spójrz sobie na definicję tego pola struktury KPIN - widzisz ???

a key_mask to już nie jest w strukturze wskaźnik - dlatego nie ma gwiazdki przed btn->key_mask

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

1bobik1 napisał(a):
moją analizę kodu można chyba porównać do pracy lodołamacza, przepraszam za moje pytania, naprawdę chcę to zrozumieć, być może przeceniam waszą cierpliwość ale zaryzykuję


Nie przepraszaj wciąż - śmiało pytaj - ale jak mówię - obiecaj mi że najpierw raz a dobrze na sucho PO KOLEI przeczytasz książkę OK ?

bo na 100% po kolei każde znaczenie operatora & było tłumaczone.....

tylko weź pod uwagę że na sucho trzeba przeczytać i pierwszą jej część teoretyczną ale tą drugą praktyczną - bo tam dopiero widać zastosowania (nawet jeśli do końca nie zrozumiesz wszystkich praktycznych przykładów - ćwiczeń)

_________________
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: 21 paź 2012, o 23:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lip 2012
Posty: 203
Lokalizacja: Sosnowiec
Pomógł: 2

Książkę przeczytałem od początku do warsztatów
z warsztatów:
5,1
5,2
5,3
5,4
5,5
5,11
5,13
5,15
8,4
czyli to co mogłem testować

"Bo widzisz tu żadna spacja nie gra roli - a kontekst zastosowania tego operatora, mogłoby być i bez żadnej spacji"
chodziło mi o to że to:
(*btn->KPIN & btn->key_mask);
to nie to samo co to:
(*btn->KPIN &btn->key_mask);

ok wracam do książki
może kiedyś to wykminię

_________________
sig on ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 paź 2012, o 09:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lip 2012
Posty: 203
Lokalizacja: Sosnowiec
Pomógł: 2

teraz jaśniej, wielkie dzięki !

_________________
sig on ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 paź 2012, o 20:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lip 2012
Posty: 203
Lokalizacja: Sosnowiec
Pomógł: 2

1. Ostatnia próba
2.
3. Proszę o sprawdzenie mojej dzisiejszej rozkminki (Eclips i Ctrl z klikiem - fajna sprawa ! )
4.
5.
Kod:
6.    volatile uint8_t *KPIN;    //       Definicja Wskaźnika KPIN w nowym typie struktury TBUTTON (volatile zmienna używana poza funkcją)
7.   
8.   TBUTTON button;                // definicja struktury KLAWISZA
9.   
10.    button.KPIN = &PINC;     //     deklaracja zmiennej w strukturze button i pobranie adresu z PINC
11.   
12.   (iom8.h)     #define PINC   _SFR_IO8(0x13)
13.   
14.   
15.   register uint8_t key_press = (*btn->KPIN & btn->key_mask);     //        deklaracja zmniennej , przypisanie wartości z operacji logicznej.  *btn->KPIN  dane z komórki spod wczesniej pobranego adresu     
16.   
17.   key_mask = (1<<PC6)  ==  key_mask = (1<<6)    == key_mask = (00100000)   
18.            (00100000  & 00100000) daje logiczne 1
19.   
20.   #define PC6   6    (iom8.h)
21.   



nie wnikam głębiej w funkcję _SFR_IO8(0x13) zakładam że zwraca stan na PINC

_________________
sig on ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 paź 2012, o 21:32 
Offline
Moderator
Avatar użytkownika

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

dokładnie PINC - to zawartość rejestru wejściowego portu C .... może doczytaj jeszcze troszkę rzeczy z bloga np to:

http://mirekk36.blogspot.com/2012/01/av ... stawy.html

a wartość key_press będzie zależała oczywiście od tego czy klawisz jest wciśnięty czy też 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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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