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



Teraz jest 29 mar 2024, o 05:49


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 25 paź 2012, o 12:06 
Offline
Nowy

Dołączył(a): 14 wrz 2012
Posty: 23
Pomógł: 1

Witam, mam pytanie, które właściwie kieruję do Pana Mirka. Programowania w C uczyłem się z Pana pierwszej książki, teraz zająłem się nauką programowania w tym języku STM32, czytając książkę, która mi w mojej nauce pomaga natknąłem się na takie zdanie: "Poprzedzenie zmiennej słowem extern informuje kompilator, że zmienna ta jest już zadeklarowana w innym module programu". Definicja ze strony http://4programmers.net/c/extern mówi podobnie:

Extern
Cytuj:
Oznacza, że deklaracja nie jest deklaracją w sensie fizycznym, a jedynie odwołaniem do deklaracji znajdującej się w innej jednostce kompilacji (module, pliku, bibliotece - przyp. autora). Jednym słowem, jest to sposób na poinformowanie kompilatora, by nie szukał danej zmiennej globalnej w aktualnym pliku.


Natomiast Pan extern tłumaczy jako: "przydomek extern powoduje, iż zmienne będą dostępne we wszystkich modułach, które dołączą plik nazwa.h za pomocą dyrektywy #include". jest to zdanie wycięte z pliku nagłówkowego w którym była deklaracja zmiennych poprzedzona słowem extern.

Według mnie definicje przytoczone powyżej wykluczają się z Pana definicją, ponieważ one tłumaczą extern jako przydomek informujący, że dana zmienna została już zadeklarowana w innym module, a Pan tłumaczy, że przydomek ten sprawia, że zmienne będą dostępne w innych modułach, które dołączą plik nagłówkowy, w którym zostały zadeklarowane. Chciałem zapytać jak to jest rzeczywiście? Czy tylko dla AVR'ów jest inaczej?



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

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

Ależ nic się nie wyklucza ;) Ja bym nawet tylko nieco uściślił swoją wypowiedź z książki, o tak:

Cytuj:
Poprzedzenie zmiennej słowem extern informuje kompilator, że zmienna ta jest już zdefiniowana w innym module programu


Ja powiedziałbym, że ta definicja, którą przytoczył kolega jest wręcz mniej precyzyjna

Cytuj:
Oznacza, że deklaracja nie jest deklaracją w sensie fizycznym, a jedynie odwołaniem do deklaracji znajdującej się w innej jednostce kompilacji (module, pliku, bibliotece - przyp. autora). Jednym słowem, jest to sposób na poinformowanie kompilatora, by nie szukał danej zmiennej globalnej w aktualnym pliku


deklaracja nie jest deklaracją ? ... a co to ? ......

DEKLARACJA zmiennej z przydomkiem extern (bo tylko wtedy jest do deklaracja gdy przy zmiennej jest extern) nie jest DEFINICJĄ (i jak się tak napisze to nawet nie trzeba dodawać że "w sensie fizycznym") .... Bo jak ktoś zna różnicę pomiędzy DEKLARACJĄ a DEFINICJĄ (co wałkuję wciąż w książce) to chyba jest to zrozumiałe. Ale przypomnę:

DEKLARACJA - nie rezerwuje miejsca w pamięci na zmienną lub funkcję

DEFINICJA - rezerwuje miejsce w pamięci na zmienną lub funkcję.

No i to ostatnie zdanie:

Cytuj:
Jednym słowem, jest to sposób na poinformowanie kompilatora, by nie szukał danej zmiennej globalnej w aktualnym pliku


jest hmm lekkim nieporozumieniem wręcz. Bo pomyśl sobie, masz np plik lcd.h w którym masz

Kod:
extern int zmienna; // DEKLARACJA zmiennej


za to w pliku lcd.c , w którym na początku inkludujemy lcd.h mamy właściwą DEFINICJĘ tejże zmiennej, czyli:

Kod:
int zmienna; // DEFINICJA ZMIENNEJ


to pytam - jak to się ma do tego zdania ? ;) .... przecież "zmienna" jest w ramach tego pliku jednocześnie zmienną globalną - widoczną w całym pliku nawet gdyby nie było deklaracji w lcd.h - zgadzasz się z tym?

a zatem co ? gdy dodamy lcd.h - to nagle kompilator co ? nie będzie szukał zmiennej globalnej w aktualnym pliku ???? sam chyba teraz widzisz to nieporozumienie :(

zresztą kompilator nic nie szuka, ktoś być może nie zdaje sobie sprawy z etapów kompilacji programów w języku C....

każdy plik *.C jest kompilowany oddzielnie, i teraz jeśli np mam plik main.c , w którym mam zainkludowany nasz lcd.h z tą DEKLARACJĄ zmiennej jak wyżej - to po PIERWSZYM etapie kompilacji w pliku przejściowym jest tylko informacja, że gdzieś w innej części programu (w innym pliku *.c nie ważne na tym etapie, wystąpi zmienna i będzie określony jej adres) ... i rzeczywiście w trakcie ostatniego procesu kompilacji jakim jest LINKOWANIE - dopiero zostają podstawiane fizyczne adresy - gdy wszystkie kawałki kodu zostają LOKOWANE w poszczególnych miejscach pamięci a jednocześnie gdy w pamięci RAM przydzielane są adresy zmiennych.

Więc ja określiłbym przytoczoną przez ciebie definicję jako delikatnie nieprecyzyjną - ale na pewno nie wykluczającą z tym co napisałem w książce. I co więcej - nie ma to nic wspólnego z AVR , STM czy jakimkolwiek innym procesorem. Tu jest mowa o języku C całkowicie w oderwaniu jak widzisz od platformy.

teraz jaśniej ? ;)

_________________
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: 25 paź 2012, o 16:54 
Offline
Nowy

Dołączył(a): 14 wrz 2012
Posty: 23
Pomógł: 1

Tak, teraz już rozumiem. Wróciłem jeszcze raz do tego miejsca w książce i wszystko stało się już jasne. Dziękuję za wytłumaczenie ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lis 2014, o 18:30 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 126
Pomógł: 0

Witam.
Mam jeszcze takie pytanie odnośnie extern.
Są 2 pliki:
lcd.h oraz lcd.c
Jeżeli w innym pliku powiedzmy ds18b20.c potrzebuję korzystać z jednej zmiennej x zdefiniowanej w lcd.c, to z punktu widzenia kompilatora lepiej do pliku ds18b20 dołączyć plik lcd.h ( #include "lcd.h, gdzie zmienna x jest zadeklarowana) czy w pliku ds18b20 użyć extern x ?
Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lis 2014, o 18:36 
Offline
Moderator
Avatar użytkownika

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

Cytuj:
Jeżeli w innym pliku powiedzmy ds18b20.c potrzebuję korzystać z jednej zmiennej x zdefiniowanej w lcd.c, to z punktu widzenia kompilatora lepiej do pliku ds18b20 dołączyć plik lcd.h ( #include "lcd.h, gdzie zmienna x jest zadeklarowana) czy w pliku ds18b20 użyć extern x ?
Pozdrawiam.


Może powiedz o jaką zmienną chodzi ? bo jeśli w pliku ds18b20 korzystasz i tak z wyświetlania LCD to naturalne jest że tam zainkludujesz lcd.h

ale jeśli ty sam dodałeś jakąś specyficzną zmienną do plików lcd i nagle okazuje się że korzystać z niej musisz w innych plikach to zastanów się czy nie warto utworzyć jakichś plików wspólnych dla wszystkich innych bibliotek np

common.c z definicją zmiennej
common.h z deklaracją zmiennej

o wtedy inkludować tam gdzie trzeba common.h - żeby było tak jakoś logicznie. Bo po co np inkludować lcd.h do ds18b20 jeśli w nim nie korzystasz z ŻADNEJ funkcji lcd ? Przy takim podejściu i przy większym projekcie będzie groch z kapustą wtedy

_________________
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: 8 lis 2014, o 22:42 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 126
Pomógł: 0

Chodzi mi o czysto teoretyczną sytuację dla jednej zmiennej. Nazwy plików podałem przykładowe.
Wiem, że jeżeli mammy kilka zmiennych to lepiej jest utworzyć pliki 'common'.
Ale dla jednej zmiennej, to raczej nie ma sensu tworzenia common i lepiej jest użyć 'extern' ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lis 2014, o 22:55 
Offline
Moderator
Avatar użytkownika

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

no dokładnie tak

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