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



Teraz jest 27 lip 2026, o 20:11


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 17 sty 2013, o 09:36 
Offline
Użytkownik

Dołączył(a): 27 lis 2012
Posty: 291
Pomógł: 6

Od czasu do czasu wracam do książki.
Na str 130 w pliku klawiatura.c jest deklaracja
static uint8_t bufor;
Oznacza to, że zmienna bufor nie będzie widoczna w innych plikach.
Ale czy jest to konieczne, skoro w pliku klawiatura.h nie ma żadnej deklaracji odnośnie zmiennej bufor?
W tym deklaracji extern uint8_t bufor;
Oczywiście będzie to działało, ale dla mnie są to 2 grzyby w barszczu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sty 2013, o 10:23 

Pomógł: 0

mg101 napisał(a):
Od czasu do czasu wracam do książki.
Na str 130 w pliku klawiatura.c jest deklaracja
static uint8_t bufor;
Oznacza to, że zmienna bufor nie będzie widoczna w innych plikach.
Ale czy jest to konieczne, skoro w pliku klawiatura.h nie ma żadnej deklaracji odnośnie zmiennej bufor?
W tym deklaracji extern uint8_t bufor;
Oczywiście będzie to działało, ale dla mnie są to 2 grzyby w barszczu.


Nie do końca rozumiem twoje pytanie.
Co do "STATIC" to oznacza tylko tyle, że zmienna statyczna to rozwiązanie pomiędzy zmienną globalną, a lokalną.
Polecam ci wrócić na stronę 124 Blue Booka ;).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sty 2013, o 11:56 
Offline
Użytkownik

Dołączył(a): 27 lis 2012
Posty: 291
Pomógł: 6

rezasurmar napisał(a):
Co do "STATIC" to oznacza tylko tyle, że zmienna statyczna to rozwiązanie pomiędzy zmienną globalną, a lokalną.
Polecam ci wrócić na stronę 124 Blue Booka ;).

STATIC użyty w funkcji oznacza że zmienna ta będzie pamiętana także po wyjściu z funkcji.
STATIC użyty przed funkcją oznacza że jest to zmienna globalna ale niewidoczna dla innych plików. Takie STATIC było w moim pytaniu. Zastanawiam się tylko czy w pliku klawiatura.c wystarczy tylko dać samo uint8_t bufor (zamiast static uint8_t bufor). Bo jeżeli nic nie napiszę w pliku klawiatura.h o uint8_t bufor tzn. że nie udostępniam uint8_t bufor innym plikom. Czyli efekt będzie taki sam jak static uint8_t bufor.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sty 2013, o 12:06 
Offline
Moderator
Avatar użytkownika

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

mg101 napisał(a):
Oznacza to, że zmienna bufor nie będzie widoczna w innych plikach.
Ale czy jest to konieczne, skoro w pliku klawiatura.h nie ma żadnej deklaracji odnośnie zmiennej bufor?
W tym deklaracji extern uint8_t bufor;
Oczywiście będzie to działało, ale dla mnie są to 2 grzyby w barszczu.


No tak tylko po co takie podejście, że są to 2 grzyby w barszczu ??? czyli co - że jakaś głupota kompilatora czy też języka C ? chce kolega powiedzieć ?

A może jednak warto sobie dalej podrążyć temat i dowiedzieć się więcej - zamiast uznawać to za nonsens. Nie jest tak prosto czasem zdalnie przez książkę wytłumaczyć WSZYSTKO a szczególnie początkującej osobie, która na tym etapie programowania rzadko nawet skorzysta z takiego mechanizmu.

Specyfikator static może działać i działa w CAŁKIEM inny sposób gdy stosujemy go do zmiennych GLOBALNYCH i całkiem inaczej dla zmiennych LOKALNYCH (automatycznych) ..... najpierw proszę sobie dobrze poćwiczyć i zrozumieć te dwie rzeczy - jak radzi kolega wyżej, aby przejść ze zrozumieniem do dalszych rzeczy. Bo zwykle próba okiełznania następnego tematu zanim poprzedni się dobrze zrozumie skutkuje brakiem zrozumienia. Ale jak mówię - ja zawsze gdy czegoś nie rozumiem w jakimś języku - to myślę sobie - że trzeba dalej nad typ popracować i rozgryźć zamiast pisać gdzieś na forum że to nonsens. To tak jakby początkująca osoba nagle wyłapała MEGA BŁĄD kompilatora czy PODSTAW języka C. Szok. Gdyby kompilatory i sam język C były najeżone tego typu błędami to nie sądzi kolega że już dawno tysiące osób by o tym pisało? że już dawno błąd zostałby poprawiony ???? eeeeh

więc spróbuję to przybliżyć jeszcze troszkę... i będę mówił o STATIC ale w aspekcie zastosowania dla zmiennej globalnej.

I tu pewnie pierwsza konsternacja - no bo jak to globalnej ? Tak tak - bo pewnie kolega przeoczył, że pojęcie GLOBALNA zmienna obowiązuje w języku C nie do CAŁEGO PROJEKTU - czyli WSZYSTKICH plików a TYLKO do tego jednego pliku *.C w którym jest jej definicja - i to proszę sobie zapamiętać. Tą "ala globalność" dla całego projektu można uzyskać dopiero dzięki właśnie DEKLARACJOM zmiennych czyli tych ze specyfikatorem extern !!!

Jednak stosuje się czasem specyfikator STATIC w stosunku do takich zmiennych GLOBALNYCH w ramach pliku *.c z dwóch powodów:

1. po to aby zmienne te nie były widoczne (udostępnione dla innych plików projektu) np jakaś hermetyczna biblioteka

2. także po to aby dać kompilatorowi możliwość jeszcze lepszej optymalizacji dostępu do takich zmiennych, często się okazuje, i przecież MOŻNA to samemu sprawdzić, że po dodaniu specyfikatora static nagle okazuje się, że np zmieniła się ilość zajętości pamięci FLASH po kompilacji i to na PLUS. Nie oznacza to że takie zalety ujrzymy pisząc jednoplikowy projekt, gdzie mamy TYLKO main.c i w nim zmienne globalne, którym dodamy static. Wtedy może nie być żadnej korzyści - po prostu kompilator to zignoruje.


Uwaga! jeśli ktoś nie rozumiem powyżej pkt.1 to proponuję na razie nie zaprzątać sobie tym głowy - aż do czasu kiedy będzie się pisało większe projekty wieloplikowe.

_________________
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: 17 sty 2013, o 12:33 
Offline
Użytkownik

Dołączył(a): 27 lis 2012
Posty: 291
Pomógł: 6

mirekk36 napisał(a):
No tak tylko po co takie podejście, że są to 2 grzyby w barszczu ??? czyli co - że jakaś głupota kompilatora czy też języka C ? chce kolega powiedzieć ?
Na przyszłość muszę być czujny ze słownictwem. Wiedziałem że popełniam błąd myślowy. Tylko nie wiedziałem gdzie. A wyszło na to "jakie to głupoty piszą w książce". Nawet mi to nie przyszło do głowy! Wniosek. Luz to rzecz fajowa, ale trzeba uważać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sty 2013, o 13:48 
Offline
Moderator
Avatar użytkownika

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

mg101 napisał(a):
A wyszło na to "jakie to głupoty piszą w książce". Nawet mi to nie przyszło do głowy! Wniosek. Luz to rzecz fajowa, ale nie zawsze.


Nie aż tak tego nie odebrałem i przepraszam - ale ja po prostu jestem uczulony na wszelkie stwierdzenia hmm odkrycia typu, że a to procesor jest zły, a to że producent zrobił błąd w procku bo "mi nie działa", że kompilator jest zły bo robi błędy? bo nad nim nie da się zapanować, bo to bo siamto .... Niestety ale takie wypowiedzi na forach zwykle skutkują czym ????

ano tym, że za jakiś czas ktoś sobie wejdzie, w taki temat - rzuci okiem po łebkach i co ??? i za chwilę na innym forum albo na tym samym nagle napisze że

"a ja gdzieś czytałem że kompilator jest do kitu", a czytałem że TE procki są do bani bo innym też coś tam nie działa

rozumie mnie kolega? - niestety ja z takim czymś WALCZĘ a szczególnie na naszym forum i muszę ZAWSZE to sprostować. Więc nie chodzi mi tu broń Boże o jakieś przygadywanie czy uszczypliwości.

_________________
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: 17 sty 2013, o 14:20 
Offline
Użytkownik

Dołączył(a): 27 lis 2012
Posty: 291
Pomógł: 6

mirekk36 napisał(a):
bo pewnie kolega przeoczył, że pojęcie GLOBALNA zmienna obowiązuje w języku C nie do CAŁEGO PROJEKTU - czyli WSZYSTKICH plików a TYLKO do tego jednego pliku *.C w którym jest jej definicja
No właśnie. Skoro dana zmienna i tak jest widoczna tylko w tym jednym pliku bez "static" , to po co dawać "static" żeby była widoczna tylko w tym pliku. I nie jest tak że znalazłem błąd twórcy język C pana Stroustrupa , tylko czegoś nie kumam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sty 2013, o 14:42 

Pomógł: 0

mg101 napisał(a):
mirekk36 napisał(a):
bo pewnie kolega przeoczył, że pojęcie GLOBALNA zmienna obowiązuje w języku C nie do CAŁEGO PROJEKTU - czyli WSZYSTKICH plików a TYLKO do tego jednego pliku *.C w którym jest jej definicja
No właśnie. Skoro dana zmienna i tak jest widoczna tylko w tym jednym pliku bez "static" , to po co dawać "static" żeby była widoczna tylko w tym pliku. I nie jest tak że znalazłem błąd twórcy język C pana Stroustrupa , tylko czegoś nie kumam.


Mirek na stronie 124 dosyć jasno piszę po co się stosuje static, nie wiem, czemu cały czas mylisz zastosowanie static z globalnym widzeniem zmiennej, to dwie różne rzeczy.

Static stosujemy wtedy gdy zmienna ma być nie tracona np. po wywołaniu funkcji zrób_to, gdzie w środku niej jest zmienna nie_strać_mnie, jeżeli nie będzie static przed nią, to ona po wywołaniu tej funkcji przestaje istniej, czyli przestaje "pamiętać" swoją wartość, a za razem przestaje być widoczna dla innych funkcji itd.
Dzięki static, cały czas ta zmienna jest trzymana w pamięci i po wywołaniu ponownym tej funkcji ma ona tą samą wartość...... za s.124 książka niebieska. Nie wiem, czy faktycznie moje posty są przeźroczyste, ale już wyżej napisałem byś zajrzał na stronę 124.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sty 2013, o 14:49 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Jest tak aby nikt nie mógł się do niej odwołać chociażby przez przypadek. Zauważ, że każdy może sobie w innym pliku użyć zmiennej o nazwie bufor. Może użyć deklaracji extern uint8_t bufor, wtedy kompilator będzie szukał takiej zmiennej w innych plikach i znajdzie także tą, która wcale nie musi być dostępna dla innych plików. Nie jest to zbyt oryginalna nazwa w przeciwieństwie do np. bufor_klawiatury, bufor_usart, bufor_spi. Używając static tworzysz przyjazny i profesjonalny kod.


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sty 2013, o 15:59 
Offline
Użytkownik

Dołączył(a): 27 lis 2012
Posty: 291
Pomógł: 6

Krauser napisał(a):
Jest tak aby nikt nie mógł się do niej odwołać chociażby przez przypadek. Zauważ, że każdy może sobie w innym pliku użyć zmiennej o nazwie bufor. Może użyć deklaracji extern uint8_t bufor, wtedy kompilator będzie szukał takiej zmiennej w innych plikach i znajdzie także tą, która wcale nie musi być dostępna dla innych plików.

Dzięki. Teraz to do mnie trafiło!



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

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