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



Teraz jest 17 gru 2017, o 14:46


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 71 ]  Przejdź na stronę 1, 2, 3  Następna strona
Autor Wiadomość
PostNapisane: 30 wrz 2017, o 06:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 81
Pomógł: 0

mam pytanie w temacie podziału na pliki, do kodu z książki , projekt multipleksowania led , czemu

Kod:
volatile uint8_t cy1;
volatile uint8_t cy2;
volatile uint8_t cy3;
volatile uint8_t cy4;


definicjie zmiennych globalnych są umieszczone w pliku d_led.c a nie nad main w pliku main.c czemu? ,

w takim razie jak to rozumieć kompilator startując dokleja zaczynając od main.c i kolejne pliki .c w jeden wielki plik .c , taki plik dziwnie wyglądałby z definicjami zmiennych globalnych gdzieś w połowie. ;)

tak przed chwilą to przeniosłem definicjie z pliku d_led.c do pliku main.c i działa , jaka więc różnica czemu pisze się tak a nie tak ?

Jeśli umieścić definicjię zmiennej globalnej nad funkcją main to po co umieszczać jej deklaracjie w pliku nagłówkowym i dołączać, definicja to przecież jednocześnie deklaracja .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 wrz 2017, o 06:46 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 1186
Pomógł: 57

Oglądnij filmik Mirka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 wrz 2017, o 07:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 81
Pomógł: 0

;) Aha okej już ogladam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 wrz 2017, o 08:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 81
Pomógł: 0

Nie znalazłem tam odpowiedzi na moje pytanie tzn. poradnik świetny ale nie ma w nim opisanego postępowania ze zmiennymi globalnymi .

Wydaje mi się że definicjie zmiennych globalnych można umieścić w każdym pliku źródłowym projektu i tak będzie prawidłowo .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 wrz 2017, o 09:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 mar 2012
Posty: 525
Lokalizacja: Jaworzno
Pomógł: 31

Te zmienne dotyczą bezpośrednio sterowania wyświetlaczem LED(warstwy sprzętowej), dlatego jeżeli mamy wydzieloną bibliotekę do obsługi wyświetlacza to na logikę powinny być umieszczone w pliku bibliotecznym. Po co takie zmienne mają się plątać gdzieś po main.c i zaśmiecać kod programu głównego? Druga sprawa, zauważ że te zmienne są użyte w przerwaniu Timera. Funkcja obsługi przerwania jest umieszczona w pliku bibliotecznym d_led.c.

_________________
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 wrz 2017, o 09:26 
Offline
Moderator
Avatar użytkownika

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

Piotrek_P napisał(a):
Te zmienne dotyczą bezpośrednio sterowania wyświetlaczem LED(warstwy sprzętowej), dlatego jeżeli mamy wydzieloną bibliotekę do obsługi wyświetlacza to na logikę powinny być umieszczone w pliku bibliotecznym. Po co takie zmienne mają się plątać gdzieś po main.c i zaśmiecać kod programu głównego? Druga sprawa, zauważ że te zmienne są użyte w przerwaniu Timera. Funkcja obsługi przerwania jest umieszczona w pliku bibliotecznym d_led.c.

Nic dodać nic ująć

------------------------ [ Dodano po: 9 minutach ]

procek87 napisał(a):
Wydaje mi się że definicjie zmiennych globalnych można umieścić w każdym pliku źródłowym projektu i tak będzie prawidłowo .

Masz rację, wydaje ci się ....

Bo ty wciąż patrzysz z punktu widzenia programowania chyba w Bascomie albo andruino gdzie zwykle każdy pisze program w JEDNYM GIGANTYCZNYM pliku ...

Język C daje zaś ogromne możliwości pięknego podziału kod na LOGICZNE bloki (czyli pliki) ... I teraz gdy chcesz używać zmiennych cy1,cy2,cy3, cy4 w jakimś innym pliku projektu

to łatwo się domyśleć, że wystarczy zainkludować plik d_led.h

a jeśli umieścisz te zmienne w main.c .... i zechcesz ich później używać chociażby w d_led.c (BO TAM ICH UŻYWANIE JEST PODSTAWOWE) to co ? jak będziesz to inkludował - oczywiście teraz ci przez PRZYPADEK działa gdy przeniosłeś ich definicje do main.c ponieważ jak widać kompletnie nie rozumiesz co to są z kolei DEKLARACJE zmiennych, które pozostawiłeś nieruszone w d_led.h

Oczywiście tak to działa - ale teraz sobie wyobraź, że masz projekt składający się ze 120 plików ... i co? gdy za rok będziesz chciał dostać się do definicji jakiejś zmiennej to co? Będziesz szalał szukając ich po wszystkich plikach bo zapomniałeś gdzie dałeś tak ?

Gdy tymczasem wiadomo, że jak się LOGICZNIE podzieli projekt - to nawet bez szukania będzie można się domyśleć wręcz, że zmienne buforowe dla cyfr wyświetlacza LED tzn ich DEFINICJE zapewne są w pliku d_led.c

Natomiast gdyby zrobić to po twojemu - że umieścisz je w main.c i dodasz tam jeszcze zmienne ze 120 innych plików projektu to będziesz miał BONANZĘ NA KÓŁKACH - żeby delikatnie to jakoś określić

Nie wspomnę już - że coś czuję że w ogóle nie przeczytałeś rozdziału w Bluebooku na temat podziału projektu na pliki - bo gdybyś przeczytał - i nawet nie zrozumiał do końca - co bywa oczywiste gdy ktoś się uczy, że czegoś nie zrozumie - to już dawno zadałbyś pytanie do tego co w książce żeby sobie coś doprecyzować

Dlatego nie wymyślaj koła od nowa - tylko zajrzyj do książki, przeczytaj - potem dopiero obejrzyj poradnik który polecił ci kolega micky (słusznie zresztą) to wtedy okaże się, że go zrozumiesz tzn ten poradnik, i że ci jednak dodatkowo coś podpowie - że znajdziesz to czego szukasz

_________________
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: 1 paź 2017, o 06:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 81
Pomógł: 0

przeczytałem już 5 razy ten rozdział a poradnik na youtube to chyba 3 oglądnełem, jak będzie trza to i następnych 20 razy w końcu zrozumie :)

Pytanie, które mi się nasunęło dotyczy znowu zmiennych globalnych i funkcji ,

Po co w ogóle poprzedzać definicje takiej zmiennej
Kod:
static  uint8_t kow;
by ta stała się widoczna tylko w pliku, w którym jest zdefiniowana , skoro można poprostu nie wrzucać do pliku nagłówkowego deklaracji takiej zmiennej poprzedzonej
Kod:
extern uint8_t kow;
i efekt będzie taki sam zmienna będzie widoczna tylko w ramach jednego pliku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 paź 2017, o 09:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 81
Pomógł: 0

znalazłem post z odpowiedzią , ale jeśli ktoś coś opowie to będzie super, jednak

potrzebuje przykładów inaczej nie za trybie.



Ostatnio edytowano 4 paź 2017, o 20:12 przez procek87, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 paź 2017, o 11:41 
Offline
Moderator
Avatar użytkownika

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

przeczytaj rozdział w Bluebooku o zmiennych statycznych wewnątrz funkcji i wtedy jak czegoś nie zrozumiesz to zadaj pytanie - bo mi ciężko tu powtarzać to samo co w książce

_________________
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: 1 paź 2017, o 12:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 81
Pomógł: 0

zadam pytanie w odniesieniu do str 134 , rozdz 3.5.6 "Funkcje w różnych plikach projektu" no i rozdziału wcześniej o zmiennych i funkcjach statycznych ,

zauważyłem że dzieląc projekt na pliki jeśli chce się ukryć przed innymi plikami projektu zmienną globalną czy też funkcje dodaje się static przed definicją i usuwa jej deklaracje w pliku nagłówkowym wtedy jej widoczność określa się tylko dla tego pliku w którym jest ona zdefiniowana,

jeśli chce się by były widoczne pisze się ich definicje bez static z wyciągniętą deklaracją do pliku nagłówkowego pliku źródłowego z extern .

w projekcie jedno plikowym z jednym tylko main.c nie ma takiej potrzeby dlatego definicje zmiennych globalnych nie poprzedza się static bo też do jakiego pliku miała by się odnieść, można dołączyć tylko plik nagłówkowy .h w którym można zawrzeć definicje dla preprocesora makra #define.

Jeśli coś knocę to poprawcie ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 paź 2017, o 13:04 
Offline
Moderator
Avatar użytkownika

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

no i bardzo ładnie to opisałeś

Ja tylko uzupełnię, że słówko static nie służy do UKRYWANIA i ma na dodatek nieco inne znaczenie w przypadku zmiennych globalnych i lokalnych.

specyfikator static powoduje, że mówisz kompilatorowi - ZRÓB PAN sobie co chcesz w procesie optymalizacji bo mi nie zależy żeby ta zmienna czy funkcja była widoczna w innym module ... Wtedy kompilator może funkcje ze specyfikatorem static czasem potraktować jako inline a często ich widok w asemblerze będzie mocno zmieniony niż gdyby były kompilowane bez static.

No i doczytaj sobie co to takiego static dla zmiennych automatycznych/lokalnych - czyli definiowanych wewnątrz funkcji - że zachowują się wtedy jak globalne ale widoczne są tylko dla tej funkcji

_________________
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: 1 paź 2017, o 13:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 81
Pomógł: 0

dla zmiennych lokalnych stosowanie static ma inne znaczenie tak wiem taka zmienna z static zamienia się w zmienną globalną tylko tyle że widoczność ma lokalną.

staram się tak pytać i opowiedzieć poniekąd by ktoś przecierający tą drogę, następny początkujący jak ja miał łatwiej , a książkę czytam już któryś raz i za każdym razem dowiaduje się czegoś nowego, ale wiadomo warto. ;)



Ostatnio edytowano 1 paź 2017, o 17:23 przez procek87, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 paź 2017, o 14:20 
Offline
Moderator
Avatar użytkownika

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

procek87 napisał(a):
staram się tak pytać i opowiedzieć

no i to rozumiem - bo mi też łatwiej wtedy coś ew doprecyzować, wyjaśnić szerzej itp

_________________
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: 1 paź 2017, o 19:30 
Offline
Użytkownik

Dołączył(a): 26 lip 2017
Posty: 66
Pomógł: 9

procek87 napisał(a):
Po co w ogóle poprzedzać definicje takiej zmiennej
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

by ta stała się widoczna tylko w pliku, w którym jest zdefiniowana , skoro można poprostu nie wrzucać do pliku nagłówkowego deklaracji takiej zmiennej poprzedzonej
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i efekt będzie taki sam zmienna będzie widoczna tylko w ramach jednego pliku.


Nie będzie taki sam. Zmienne globalne domyślnie są widoczne w całym programie. Deklaracja ze słowem kluczowym extern nic tu nie zmienia, a potrzebna jest jedynie dla wskazania typu zmiennej.

_________________
ignorance is bliss



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 paź 2017, o 19:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 81
Pomógł: 0

kolejne pytanie w pliku main.c projektu 03_Multi_LED w pętli while rozbiłeś liczbę wyświetlaną na tysiące, setki,dziesiątki, jednostki , czy można zawartość tej pętli umieścić w jakiejś funkcji , wywoływać z while w main ,

funkcje zamknie się w pliku no i właśnie Mirku czy według Ciebie dobrym nawykiem będzie dodanie jej do pliku d_led.c odpowiedzialnego za inicjalizacjie wyświetlacza czy wydzielić ją w osobnym pliku,

------------------------ [ Dodano po: 8 minutach ]

Cytuj:
Nie będzie taki sam. Zmienne globalne domyślnie są widoczne w całym programie. Deklaracja ze słowem kluczowym extern nic tu nie zmienia, a potrzebna jest jedynie dla wskazania typu zmiennej.


kolego Roske myślę że się mylisz zmienna globalna domyślnie jest widoczna w ramach jednego pliku nie programu a deklaracja zmiennej globalnej z magicznym słowem extern oznacza nie definicjie a deklaracje ,wiadomość dla kompilatora o istnieniu takiej definicji gdzieś tam w plikach programu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 paź 2017, o 19:57 
Offline
Moderator
Avatar użytkownika

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

roske napisał(a):
Nie będzie taki sam. Zmienne globalne domyślnie są widoczne w całym programie. Deklaracja ze słowem kluczowym extern nic tu nie zmienia, a potrzebna jest jedynie dla wskazania typu zmiennej.

No tu to kolega widać, że jeszcze kompletnie nie rozumie o co chodzi przede wszystkim z DEFINICJĄ i DEKLARACJĄ zmiennej, nie wie do czego jest słówko kluczowe extern, no i hmmm nie orientuje się co do zakresu widoczności.

Ciężko znowu i od nowa to samo powtarzać, ale żeby nie było że tylko coś przygadałem i poszedłem no to doprecyzuję.

Panie kochany - zmienne GLOBALNE nie są domyślnie widoczne w całym programie - no chyba że ty masz na myśli projekt składający się z jednego pliku main.c. Jeśli projekt składa się z wielu plików to szanowny kolego - zmienna zdefiniowana w jednym z takich plików NIGDY W ŻYCIU nie będzie widoczna w innym. Zrozum to. Stanie się tak dopiero jeśli w innym pliku zainkludujesz plik *.h w którym będzie (Uważaj teraz) DEKLARACJA takiej zmiennej - a uzyskać to można w przypadku zmiennych TYLKO I WYŁĄCZNIE za pomocą specyfikatora "extern"

zaś typ zmiennej określa jej TYP po lewej stronie w DEFINICJI ;)

------------------------ [ Dodano po: 8 minutach ]

procek87 napisał(a):
kolejne pytanie w pliku main.c projektu 03_Multi_LED w pętli while rozbiłeś liczbę wyświetlaną na tysiące, setki,dziesiątki, jednostki , ... ,


ale zrozum, że ja w plikach main.c chcę tylko w jakikolwiek sposób pokazać jak się korzysta z bibliotek które omawiam. Poza tym w tym konkretnym przypadku z tym wyświetlaniem liczby - to ot tak na gorąco chciałem pokazać po prostu jeden z bardzo wielu sposobów jak matematycznie izolować KAŻDĄ pojedynczą cyfrę z dłuższej liczby ;)

procek87 napisał(a):
czy można zawartość tej pętli umieścić w jakiejś funkcji , wywoływać z while w main ,
funkcje zamknie się w pliku


no pewnie, że można - a nawet warto wydzielać funkcje - to zawsze jest najlepsza droga - nie zaś ładować KUPĘ kodu w głównej pętli programu - ale musisz też zrozumieć pewien proces dydaktyczny którym ja idę - nie jestem w stanie w tej książce od razu tego pokazać - bo byłoby to niezrozumiałe.

procek87 napisał(a):
czy według Ciebie dobrym nawykiem będzie dodanie jej do pliku d_led.c odpowiedzialnego za inicjalizacjie wyświetlacza czy wydzielić ją w osobnym pliku,

dla mnie konieczność tworzenia nowego pliku projektu pojawia się głównie wtedy gdy ma w nim być więcej niż jedna funkcja - a szczególnie gdy te funkcje mają być wywoływane z innych plików projektu

Tymczasem w tak MEGA PROSTYM przykładzie dość ciężko nawet rozpatrywać czy wydzielać do oddzielnego pliku funkcję odpowiedzialną za wyświetlanie tej liczby ...

ale rozumiem co masz na myśli i jeśli np chciałbyś stworzyć jakąś uniwersalną funkcję do wyświetlania dowolnej liczby na wyświetlaczu LED to oczywiście masz BARDZO dobry pomysł, żeby wtedy taką funkcję dodać nawet do pliku d_led.c ponieważ wtedy ładnie rozbuduje się biblioteka do obsługi wyświetlacza, i będziemy mieli np:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


wtedy zamiast w pętli głównej robić tą rozbiórkę - będzie ona ładnie schowana w d_led.C zaś w pętli głównej będzie sobie tylko zapierniczał licznik i co chwilę będzie wywoływana funkcja np:

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

_________________
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: 1 paź 2017, o 20:27 
Offline
Użytkownik

Dołączył(a): 26 lip 2017
Posty: 66
Pomógł: 9

W tych czasach niemal wszystkie informacje można łatwo zweryfikować. Pierwszy wynik z googla:
"Global variables in C are by default extern.. (i.e) they have external linkage.."
W kolejnym wyniku trochę szerzej, nie będę przepisywał oto link:
https://stackoverflow.com/questions/423 ... tic-or-not
Wpis w wikipedii jeszcze to rozszerza:
https://en.wikipedia.org/wiki/Global_va ... nd_C.2B.2B
No i na koniec cytat z Kernighan, Ritchie "Język C" (Zwracam uwagę na fragment w nawiasie):
"Przez domniemanie zmienne zewnętrzne są także "globalne", a więc wszystkie odwołania do takiej zmiennej przez tę samą nazwę (nawet z funkcji tłumaczonych oddzielnie) są odwołaniami do tego samego obiektu"

_________________
ignorance is bliss



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 paź 2017, o 20:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 81
Pomógł: 0

Roske wszystko masz w BB szukanie info po wikipedia mija się z celem w książce masz twarde info trza czytać i pytać:)



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

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

roske napisał(a):
W tych czasach niemal wszystkie informacje można łatwo zweryfikować. Pierwszy wynik z googla:
"Global variables in C are by default extern.. (i.e) they have external linkage.."
W kolejnym wyniku trochę szerzej, nie będę przepisywał oto link:
https://stackoverflow.com/questions/423 ... tic-or-not
Wpis w wikipedii jeszcze to rozszerza:
https://en.wikipedia.org/wiki/Global_va ... nd_C.2B.2B
No i na koniec cytat z Kernighan, Ritchie "Język C" (Zwracam uwagę na fragment w nawiasie):
"Przez domniemanie zmienne zewnętrzne są także "globalne", a więc wszystkie odwołania do takiej zmiennej przez tę samą nazwę (nawet z funkcji tłumaczonych oddzielnie) są odwołaniami do tego samego obiektu"


kolega widzę mocno nie rozumie co znaczy GLOBALNE ;) ja nawet nie będę dyskutował o linkach na stackoverflow bo szkoda

już prędzej odniosę się do porządnego źródła dla ciebie czyli

Cytuj:
cytat z Kernighan, Ritchie "Język C" (Zwracam uwagę na fragment w nawiasie):


to ja ci powiem, że ty musisz bardziej zwracać uwagę ... bo w książce jest DOBRZE - zmienna globalna jest GLOBALNA w ramach tego samego ale JEDNEGO pliku projektu (źródłowego pliku *.c) - i ty tego wydaje mi się kompletnie nie rozumiesz

ale to wynika zapewne z tego, że nie wiesz jak w języku C przebiega proces kompilacji - obejrzyj sobie to:
https://www.youtube.com/watch?v=FfL-Zj_RHeY

może to ci więcej rozjaśni ....

A wtedy zrozumiesz dlaczego jest specyfikator "extern" dzięki któremu możemy spowodować, że gdy go użyjemy ale uwaga w plikach nagłówkowych *.h to stworzymy DEKLARACJĘ zmiennej .... to z kolei spowoduje, że przy kompilacji kompilator zarezerwuje sobie adres na zmienną o wielkości jej typu, natomiast reszty dokończy jeden z ostatnich etapów czyli linker łączący wstępnie skompilowane pliki *.c do postaci *.o - w jeden wynikowy plik HEX albo BIN

i tak jak kolega wyżej napisał - masz to wszystko w Bluebooku

_________________
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: 1 paź 2017, o 22:03 
Offline
Nowy

Dołączył(a): 01 paź 2017
Posty: 7
Pomógł: 0

Witam,
forum czytuje sporadycznie, ale nie zrozumiałem jednej z Twoich wypowiedzi:

Cytuj:
Stanie się tak dopiero jeśli w innym pliku zainkludujesz plik *.h w którym będzie (Uważaj teraz) DEKLARACJA takiej zmiennej - a uzyskać to można w przypadku zmiennych TYLKO I WYŁĄCZNIE za pomocą specyfikatora "extern"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2017, o 00:14 
Offline
Moderator
Avatar użytkownika

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

kisiel napisał(a):
Witam,
forum czytuje sporadycznie, ale nie zrozumiałem jednej z Twoich wypowiedzi:

Cytuj:
Stanie się tak dopiero jeśli w innym pliku zainkludujesz plik *.h w którym będzie (Uważaj teraz) DEKLARACJA takiej zmiennej - a uzyskać to można w przypadku zmiennych TYLKO I WYŁĄCZNIE za pomocą specyfikatora "extern"


Chodzi o to, że aby zmienna globalna mogła być widoczna w innych plikach to trzeba powołać jej DEKLARACJĘ, a to oznacza wpisanie do pliku *.h (który będzie inkludowany tam gdzie potrzeba - czyli w różnych plikach *.c) specyfikatora "extern" a po nim typu i nazwy zmiennej ale już bez jej inicjalizacji, a w przypadku tablicy bez podawania ile ona ma elementów.

Przykład:

jakiś plik źródłowy *.c z DEFINICJAMI zmiennych

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



stworzony plik nagłówkowy *.h z DEKLARACJAMI zmiennych

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

_________________
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 paź 2017, o 08:23 
Offline
Tech-support
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 518
Lokalizacja: Kraków
Pomógł: 37

Ja jeszcze chciałbym się odnieść do tego fragmentu:
roske napisał(a):
Przez domniemanie zmienne zewnętrzne są także "globalne", a więc wszystkie odwołania do takiej zmiennej przez tę samą nazwę (nawet z funkcji tłumaczonych oddzielnie) są odwołaniami do tego samego obiektu
Moim zdaniem oznacza to, że zmienne zewnętrzne są traktowane jak globalne. Natomiast nie działa to w drugą stronę, czyli zmienne globalne niekoniecznie są zewnętrzne.

To trochę tak, jakbyś powiedział, że "wszystkie kwadraty są rombami". Ale czy to znaczy, że wszystkie romby są kwadratami?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2017, o 08:33 
Offline
Użytkownik

Dołączył(a): 26 lip 2017
Posty: 66
Pomógł: 9

Zamiast bicia piany proponuję mały test na żywym organiźmie. Trzy pliki:

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


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


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


W świetle tego co tu tak stanowczo powiedziano zmienna "jeden" zdefiniowana w pliku "foo.c", a następnie zainkludowana przez deklarację z modyfikatorem extern w "foo.h" do pliku "main.c" jest zmienną globalną widoczną w całym programie. Zmienna dwa zdefiniowana w pliku "foo.c", nie jest zainkludowana do "main.c" z modyfikatorem extern więc jej zasięg ogranicza się do pliku "foo.c". Zmienna "dwa" zdefiniowana w pliku "main.c" o przypadkowo tej samej nazwie jest całkiem inną zmienną niż ta zdefiniowana w "foo.c", jej widoczność ogranicza sie tylko do pliku "main.c". Odwołania do zmiennej "dwa" w plikach "main.c" i "foo.c" są odwołaniami do dwóch różnych obiektów.
Wynikiem wykonania programu jest ciąg liczb "100, 200, 100, 2". No to sprawdźmy. Kompilacja....wykonanie...???

No to może mała modyfikacja, pliki "foo.c" i "foo.h" pozostają takie same, plik "main.c" niech będzie taki:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kompilacja,wykonanie... :-|

No to jeszcze trzecia próba, znów modyfikujemy plik "main.c":

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


Kompilacja, wyk... :-O

Każdy może sobie ten teścik zrobić i sam się przekonać jak jest w rzeczywistości.
Have fun ;-)

_________________
ignorance is bliss



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2017, o 08:56 
Offline
Nowy

Dołączył(a): 01 paź 2017
Posty: 7
Pomógł: 0

Czyli jeżeli dobrze rozumiem. Jak nie dam extern w pliku *.h to zmienna nie będzie widoczna w innych plikach, nawet jeżeli plik nagłówkowy będzie zincludowany w innym pliku?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2017, o 09:50 
Offline
Moderator
Avatar użytkownika

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

roske napisał(a):
Zamiast bicia piany

Po pierwsze proponuję zejście o ton niżej, chyba że szanowny kolega chce sobie w ten sposób dyskutować na innym forum ...

roske napisał(a):
zmienna "jeden" zdefiniowana w pliku "foo.c", a następnie zainkludowana przez deklarację z modyfikatorem extern w "foo.h" do pliku "main.c" jest zmienną globalną widoczną w całym programie. Zmienna dwa zdefiniowana w pliku "foo.c", nie jest zainkludowana do "main.c" z modyfikatorem extern więc jej zasięg ogranicza się do pliku "foo.c". Zmienna "dwa" zdefiniowana w pliku "main.c" o przypadkowo tej samej nazwie jest całkiem inną zmienną niż ta zdefiniowana w "foo.c", jej widoczność ogranicza sie tylko do pliku "main.c". Odwołania do zmiennej "dwa" w plikach "main.c" i "foo.c" są odwołaniami do dwóch różnych obiektów.


I co to ma oznaczać wg ciebie ? Toż ZDEFINIOWAŁEŚ w dwóch plikach dwie zmienne o takiej samej nazwie ! Oznacza to, że nazwy się pokrywają, pisząc to napisałeś pokazujesz z kolei że chyba nie wiesz co to oznacza "zasięg zmiennych / przesłanianie nazw". Twój cały rozbudowany przykład można sprowadzić do bardzo prostego:


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


jak myślisz jaka liczba się ukaże w wyniku tego ? oczywiście 200 i nic w tym dziwnego ponieważ zakres widoczności zmiennej będzie działać zawsze na korzyść zmiennej lokalnej funkcji albo pliku.

Natomiast twój przykładowy kod zawiera PASKUDNE błędy - dlaczego? Dlatego właśnie, że w obszarze zmiennych globalnych każdego modułu ZDEFINIOWAŁEŚ wielokrotnie zmienną o nazwie dwa. Zrób sobie prosty test, dodaj trzeci moduł projektu, tzn kolejną parę plików *.c i *.h i zrób to samo czyli w trzecim również spróbuj zdefiniować zmienną o nazwie dwa i zobacz czy ci się to skompiluje ....

albo ... np usuń definicję int dwa; ze swojego main.c .... i co? uda się kompilować ? ... no nie uda się ;) ... jeśli zaś dodasz w pliku foo.h DEKLARACJĘ ZMIENNEJ czyli

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


to wtedy kompilacja się powiedzie

_________________
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 paź 2017, o 10:12 
Offline
Użytkownik

Dołączył(a): 26 lip 2017
Posty: 66
Pomógł: 9

Widzę, że nawet nie skompilowałeś tych przykładów.

mirekk36 napisał(a):
Dlatego właśnie, że w obszarze zmiennych globalnych każdego modułu ZDEFINIOWAŁEŚ wielokrotnie zmienną o nazwie dwa.


Zmienna zdefiniowana w "obszarze zmiennych globalnych modułu" jest zmienną globalną, nieprawdaż? A obszary te chyba nie są rozłączne skoro te dwie definicje ze sobą kolidują? Jeśli tak to zdaje się, że właśnie potwierdziłeś to co napisałem kilka postów wcześniej:
"Zmienne globalne domyślnie są widoczne w całym programie. Deklaracja ze słowem kluczowym extern nic tu nie zmienia"
Jest coś jeszcze do dodania?

_________________
ignorance is bliss



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2017, o 10:35 
Offline
Nowy

Dołączył(a): 01 paź 2017
Posty: 7
Pomógł: 0

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


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


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


Pomijam fakt totalnego braku enkapsulacji, co jest wręcz rzeczą niedopuszczalną przy pisaniu niezależnego modułu. Ale jak widać, zmienna, która została zdeklarowana w pliku module.h jak i zmienna_extern, są widoczne we wszystkich plikach, w jakich występuje

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


Także zmienne globalne, to zmienne globalne i tyle. Myślę że tym przykładem wyjaśniłem temat używania extern'a podczas programowania w języku C. Słowo extern należy zamienić na zestaw getterów oraz setterów dla danego modułu aby wpajać już od początków przynajmniej podstawy eknapsulacji modułu.

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2017, o 10:36 
Offline
Moderator
Avatar użytkownika

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

roske napisał(a):
Jeśli tak to zdaje się, że właśnie potwierdziłeś to co napisałem kilka postów wcześniej:

Nie potwierdziłem, wręcz odwrotnie - proszę spróbuj usunąć definicję "dwa" z main.c i powiedz czy definicja "dwa" istniejąca w obszarze zmiennych globalnych modułu foo.h - rozprzestrzeni się samoistnie do pliku main.c

zrób ten prosty test - później porozmawiamy dalej i doprecyzujemy

------------------------ [ Dodano po: 3 minutach ]

kisiel napisał(a):
zmienna, która została zdeklarowana w pliku module.h

mylisz pojęcia,

w pliku *.h dokonałeś DEFINICJI zmiennej - czego się nie robi w języku C a drugi zapis ze specyfikatorem extern to DEKLARACJA - sorki ale wydaje mi się, że właśnie koledzy nie do końca rozumieją różnicę pomiędzy DEFINICJĄ a DEKLARACJĄ zmiennej i stąd takie pomysły - bo bo ten pomysł

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


bije już na głowę wszystko ... jeszcze raz podkreślam. W języku C nie robimy DEFINICJI zmiennych w plikach nagłówkowych - a jeśli ją tak zrobisz to owszem zadziała ale w przyszłości sporo sobie namieszasz takim podejściem bo wiesz - są i tacy co np inkludują pliki źródłowe i piszą, że im to zadziałało - to znaczy, że tak można w C. Można ? ;)

_________________
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 paź 2017, o 10:56 
Offline
Użytkownik

Dołączył(a): 26 lip 2017
Posty: 66
Pomógł: 9

Cytuj:
Nie potwierdziłem, wręcz odwrotnie - proszę spróbuj usunąć definicję "dwa" z main.c i powiedz czy definicja "dwa" istniejąca w obszarze zmiennych globalnych modułu foo.h - rozprzestrzeni się samoistnie do pliku main.c


Oczywiście, że się "rozprzestrzeni", ale kompilator zgłosi błąd ponieważ nie będzie znał typu zmiennej. Też już o tym pisałem.
Proponuję Ci jednak skompilować i uruchomić choćby tylko mój pierwszy programik main.c/foo.c/foo.h, albo to co przedstawił kisiel (właściwie jest to niemal to samo co moje programiki). Myślę, że się zdziwisz.

_________________
ignorance is bliss



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2017, o 11:02 
Offline
Nowy

Dołączył(a): 01 paź 2017
Posty: 7
Pomógł: 0

Kto nie rozumie co to jest deklaracja? Po pierwsze, deklaracja jest w momencie kiedy zmienna posiada typ oraz nazwę i NIE WAŻNE gdzie wpiszemy tą deklaracje, czy w pliku *.h czy w pliku *.c - to nadal jest DEKLARACJA. Definicja zmiennej następuje, kiedy do zmiennej przypisujemy jakąś wartość.

Chciałbym zapoznać się z miejscem w standardzie opisującym język C, mówiącym o tym że w tymże języku nie ma żadnej możliwości DEKLARACJI zmiennej. Jeżeli zaś, mówimy o tym że w przyjętym sposobie programowania nie używa się metody DEKLARACJI zmiennej w plikach nagłówkowych, to z tym nie będę dyskutować.

mirekk36 napisał(a):
bije już na głowę wszystko ... jeszcze raz podkreślam. W języku C nie robimy DEKLARACJI zmiennych w plikach nagłówkowych - a jeśli ją tak zrobisz to owszem zadziała ale w przyszłości sporo sobie namieszasz takim podejściem bo wiesz - są i tacy co np inkludują pliki źródłowe i piszą, że im to zadziałało - to znaczy, że tak można w C. Można ? ;)


Jak pierwsza część to totalna bzdura, bo specyfika języka C nijak nie zabrania takich rzeczy, to już druga część potwierdza jedynie moje słowa o enkapsulacji, co automatycznie każe zastanowić się programiście nad tym czy warto w takim razie dodawać do każdej zmiennej (notabene jeżeli nie jest ona poprzedzona słowem static, to jest ona z automatu extern) słowa "extern", co sprowadza znów do tego że w kodzie jest śmietnik ;)

http://www.open-std.org/jtc1/sc22/wg14/ ... /n1124.pdf
I żeby nie było że jestem gołosłowny - w podanym linku standard języka C mówi
Cytuj:
6.2.2 Linkages of identifiers:
For an identifier declared with the storage-class specifier extern in a scope in which a prior declaration of that identifier is visible, if the prior declaration specifies internal or external linkage, the linkage of the identifier at the later declaration is the same as the linkage specified at the prior declaration. If no prior declaration is visible, or if the prior declaration specifies no linkage, then the identifier has external linkage.


Chciałbym też nadmienić że nie jestem jakiś tam pierwszy lepszy szaraczek, tylko programowaniem w C zajmuje się zawodowo już od paru lat. Czekam na merytoryczne ustosunkowanie się do standardu C :)

Pozdrawiam

------------------------ [ Dodano po: 10 minutach ]

Dla potwierdzenia moich słów przeprowadziłem drugi test:

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


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


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


wynik:
Kod:
zmienna bez extern: 0                                                                                                                                                                                                                                                                                                       
zmienna z extern: 15                                                                                                                                                                                                                                                                                                         
zmienna bez extern: 5                                                                                                                                                                                                                                                                                                       
zmienna z extern: 6 


Dla wszystkich tych, co chcą przetestować czy to działa czy nie, krótka instrukcja kompilacji z konsoli linuxowej:
1. Tworzymy katalog
2. Wrzucamy tam pliki
3. Wywołujemy polecenie:
Składnia: [ Pobierz ] [ Ukryj ]
język bash
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pozdrawiam



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: 71 ]  Przejdź na stronę 1, 2, 3  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Manekj i 0 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