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



Teraz jest 27 gru 2024, o 06:25


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 2 lip 2013, o 12:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 60
Pomógł: 0

Witam.
Pewnie każdy z Was domyśli się, iż jestem początkującym, dlatego właśnie mam pytanie dotyczące funkcji statycznej. Podczas wertowania przykładu 5.5 LED w niebieskiej książce napotkałem się na funkcję, oto i ona:

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



Moje pytanie dotyczy, dlaczego jest ona funkcją statyczną (tak, wiem, że jest to napisane, ale wytłumaczenie "nie będzie ona udostępniana na zewnątrz do innych modułów" jakoś do mnie nie przemawia, tak już jest jak wcześniej zabrałem się za Bascoma, tam takich problemów nie było :D )

Drugi problem to zrozumienie działania tej funkcji. Ogólnie rzecz biorąc wiem o co chodzi, przesyłanie 4 bitów do linii D7...D4. Wszystko OK, ale jeśli mógłby ktoś naprowadzić mnie na poprawny tok myślenia co do argumentu funkcji "data" byłbym wdzięczny. Czy dobrze rozumuję zapis:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Według mnie sprawa ma się tak.
Jeżeli argument "data" ma wartość załóżmy 0000 0010 , a 1<<0 oznacza 0000 0001, to operacja:
0000 0010 & 0000 0001 wyniesie 0000 0000 czyli fałsz.
Jeżeli zaś data wynosi 0000 0001 to w tej sytuacji w wyniku operacji data & (1<<0) otrzymamy prawdę?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lip 2013, o 12:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
Niepotrzebnie sobie komplikujesz; przeczytaj jeszcze raz ten przykład ze str.209
Jest tam napisane o pojedynczych bitach bajtu." ...Za każdym razem... "
Pozdr.



Ostatnio edytowano 2 lip 2013, o 18:14 przez kicajek, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lip 2013, o 13:18 
Offline
Moderator
Avatar użytkownika

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

robert95 napisał(a):
wcześniej zabrałem się za Bascoma, tam takich problemów nie było

Zacząłbym od tego - że w Bascomie nie ma TAKICH możliwości więc nie miałeś problemów ze zrozumieniem czegoś czego nie ma

robert95 napisał(a):
Moje pytanie dotyczy, dlaczego jest ona funkcją statyczną (tak, wiem, że jest to napisane, ale wytłumaczenie "nie będzie ona udostępniana na zewnątrz do innych modułów" jakoś do mnie nie przemawia


Twój kłopot wynika z tego że na razie albo nie doczytałeś w Bluebooku, albo jeszcze nie zaskoczyłeś na czym polega przede wszystkim podział projektu na pliki :( tu leży twój pies pogrzebany

poza tym co to znaczy - (nie rozumiem - dlatego dopytuję) że to do ciebie nie przemawia ? ... to znaczy że co ?

generalnie można ograniczać w C widoczność funkcji z jakiegoś pliku aby nie były widoczne w innych plikach .... ale jak ma to do ciebie przemówić - skoro pewnie jeszcze właśnie nie przećwiczyłeś podziału projektu na pliki

więc nawet nie jesteś na razie w stanie dostrzec do czego i kiedy przydaje ci się ta właściwość.

W Bascomie to PROJEKT = 1 PLIK .... i np 300 tys linii kodu w jednym pliku ..... więc nie mów mi że w Bascomie nie było problemów - bo takie podejście do pisania kodu to dopiero PROBLEM :(

_________________
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: 2 lip 2013, o 19:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 60
Pomógł: 0

Cytuj:
Twój kłopot wynika z tego że na razie albo nie doczytałeś w Bluebooku, albo jeszcze nie zaskoczyłeś na czym polega przede wszystkim podział projektu na pliki tu leży twój pies pogrzebany

Jest Pan w wielkim błędzie (bez obrazy). Książkę z funkcjami statycznymi przewertowałem w tę i nazad... Rozumiem co to znaczy podział na pliki: w jednym, nagłówkowym, umieszczamy wszystkie definicje itp. aby potem móc tylko napisać w pliku głównym #include "nazwa.h" i cieszyć się np. o wiele bardziej przystępnymi nazwami, przede wszystkim krótszymi, które są umieszczone w tej naszej "bibliotece". Przykładowo w pliku nagłówkowym umieścimy instrukcje:
#define LED_ON PORTA |= (1<<PA0)
Następnie korzystamy z niej przystępnie i w łatwy do zapamiętania sposób. Drugą zaletą jest to, że możemy zmienić co nam się podoba, ale wówczas tylko w pliku nagłówkowym w 1 miejscu! Ot i cała filozofia.
Ogólnie zdaję sobie sprawę jakie są zalety podziału na pliki itp. ale nie rozumiem dlaczego ta funkcja, o której mowa, ma być funkcją statyczną? TU PIES POGRZEBANY ! :(

Podkreślam, że co to funkcja statyczna wiem, ale dlaczego akurat tutaj należy ją użyć? Dlaczego ma być niewidoczna dla innych modułów?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lip 2013, o 20:49 
Offline
Moderator
Avatar użytkownika

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

Cytuj:
Jest Pan w wielkim błędzie (bez obrazy).


Nie obrażam się i pewnie masz rację - ja jestem tylko człowiekiem i też się mylę.

robert95 napisał(a):
Rozumiem co to znaczy podział na pliki: w jednym, nagłówkowym, umieszczamy wszystkie definicje itp. aby potem móc tylko napisać w pliku głównym #include "nazwa.h" i cieszyć się np. o wiele bardziej przystępnymi nazwami, przede wszystkim krótszymi, które są umieszczone w tej naszej "bibliotece"


I mam nadzieję, że też się nie obrazisz jeśli jednak powiem, że jeszcze może nie do końca to rozumiesz ale już staram się pomóc i doprecyzować - pytać zawsze warto - po to jest to forum.

na czerwono zaznaczyłem jeden z poważniejszych błędów jaki popełniasz w rozważaniach (być może to tylko literówka i miałeś na myśli deklaracje) no ale skoro napisałeś definicje - to muszę się do tego odnieść bo przez pół książki staram się wyjaśniać i zwracać uwagę, że NIEZROZUMIENIE różnic w tej kwestii czyli czym różni się definicja o deklaracji jest powodem ogromnej ilości dalszych błędów w rozumieniu. A więc w tym miejscu powinno być że w pliku nagłówkowym umieszczamy DEKLARACJE .... a wyjątkiem są (definicje preprocesora) ale to coś innego niż definicje w języku C. Reasumując pliki nagłówkowe owszem są także po to aby umieszczać w nich definicje preprocesora #define itp ... ale to mały pikuś jeśli chodzi o istotę zalet podziału na pliki

Bodajże najważniejszą rzeczą jest to że dzięki nie można pięknie dzielić projekt na logicznie połączone fragmenty/ klocki.

Oczywiście później dołączamy w plikach źródłowych *.c tylko pliki *.h w których mamy co ? (zapomnij na razie o definicjach preprocesora ok)

w których mamy DEKLARACJE funkcji naszej tzw biblioteki - zgadza się ?

i teraz pomyśl jak ja piszę bibliotekę to te funkcje które chcę eksportować do innych plików pewne funkcje - tak aby użytkownik się nimi posługiwał to DEKLARACJE tych funkcji przenoszę do pliku nagłówkowego. Dzięki temu funkcje te dostępne są dla użytkownika - bazując na tym przykładzie LCD masz dostępne takie np funkcje jak:

lcd_str()
lcd_int()

i wiele innych zgadza się ? i zauważ że na końcu pliku nagłówkowego są ich DEKLARACJE bo DEFINICJE są w pliku *.c

ale .... ale czy widzisz w pliku *.h DEKLARACJĘ tej funkcji o którą pytasz w pierwszym wątku ? No przyznasz chyba że nie ...

co to oznacza ? oznacza to kilka rzeczy

po pierwsze nie uważałem tego za stosowne aby dawać użytkownikowi tej biblioteki dostępu do tej funkcji - i chyba widzisz że pomimo dołączenia pliku *.h nie uda ci się z niej skorzystać w pliku main.c zgadza się ????

dokonałem tego właśnie m.in w ten sposób że nie dałem DEKLARACJI w pliku nagłówkowym, ale gdybym nie opatrzył jej jeszcze dodatkowo słówkiem static to gdybyś spróbował sam ją dodać do *.h i jej użyć w swoim main.c - to udałoby ci się to

gdy zaś opatrzyłem ją specyfikatorem static to powiedziałem kompilatorowi

EEE panie kompilator, wara ze swoimi łapskami .... i pod żadnym pozorem nie udostępniaj tej funkcji jeśli user chciałby z niej skorzystać ... i tym razem gdybyś chciał z niej skorzystać to kompilator już nie da ci warninga a ERROR'a i QUNIEC


ale jest jeszcze jedna ważna zaleta specyfikatora static dla funkcji. Jeśli go użyłem i kompilator wie, że taka funkcja nie będzie do użtku publicznego to może ją optymalizować w trakcie kompilacji o wiele lepiej na tle że po prostu kod funkcji oddzielnej zniknie a jej rozkazy zostaną wmiksowane w każde miejsce gdzie została użyta - tak jak funkcja inline - albo jeszcze inne sztuczki zrobi i w efekcie twoim oczom ukaże się po kompilacji że zużyłeś MNIEJ pamięci FLASH niż gdyby była bez static

może teraz lepiej ?

_________________
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: 2 lip 2013, o 21:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 60
Pomógł: 0

Dzięki wielkie panie Mirosławie, teraz nastała jasność w mojej głowie, przynajmniej w tym temacie. Pozostaje mi przystąpić do dalszej analizy rozdziału, swoją drogą wiem, że zadaję banalne wręcz pytania, ale jest to dla mnie naprawdę wyprawa w "nowy świat". Teraz widzę większą władzę w rękach programisty języka C w porównaniu programisty języka Bascom, jednak jak pan pisał wcześniej - wiele zależy od programisty, nieprawdaż? ;)
Dziękuję wszystkim za odpowiedzi w tym temacie, przystępuje do dalszej miłej "męczarni" nad analizą tematu.
Pozdrawiam, robert95.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lip 2013, o 22:21 
Offline
Moderator
Avatar użytkownika

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

robert95 napisał(a):
swoją drogą wiem, że zadaję banalne wręcz pytania


a co tam - kto pyta nie błądzi - o wiele lepiej pytać i pytać niż się poddać w zaciszu domowym i stwierdzić że C to nie dla mnie .... więc cieszę się że pytasz

robert95 napisał(a):
jednak jak pan pisał wcześniej - wiele zależy od programisty, nieprawdaż?


zawsze będę podtrzymywał zdanie, że każdy język programowania jest tylko tak dobry jak programista, który się nim posługuje ;)

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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO