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



Teraz jest 26 kwi 2024, o 03:47


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 11 sie 2014, o 18:14 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 24 lip 2014
Posty: 24
Pomógł: 0

Witam, chciałbym zadać Wam kilka wścibskich pytań, które nurtują mnie, ale odpowiedzi na nie będą bardzo pomocne i myślę, że rozwieją wątpliwości do podobnych sytuacji. A mianowicie:
- mam takie linijki kodu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

Więc pierwsze pytanie brzmi: skąd kompilator wie, że jak piszę przykładowo to SEG_A (1<<0), że chodzi tu o pin w porcie C zamiast np.B, czy A? Czy chodzi tu o to, że napisałem CA1 to (1<<0) więc przypisanie do portu A odpada, a że nie pisałem w ogóle o stanie w porcie B, to PORTB też odpada i pozostaje to C, który to port jest ustawiony na wysoki?

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

i ten wers jest deklaracją zmiennej globalnej, która znajduje się w pliku tymże d_led.h . Więc teoretycznie (chyba)powinno się, przy dołączeniu tego pliku nagłówkowego do innego pliku, sprawić że każda taka zmienna bez extern i tak zostanie dołączona do innego pliku i "zrozumiana" przez kompilator, a extern sprawia, że te zmienne będą dołączone we wszystkich modułach, które d_led.h dołączą, więc (chyba) niekonieczne jest dołączanie externa.Usunąłem go i kompilator nie pokazywał błędu(ale w praktyce nie sprawdziłem). Więc powinno się użyć w takiej sytuacji externa? Czy błąd wystąpi w praktyce, a w kompilatorze nie?

Kolejny wstęp i pytanie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Te dyrektywy zapewniają zabezpiecznie przed wielokrotnym dołączeniem tego samego pliku nagłówkowego do innych plików. Z ciekawości też skasowałem te 2 wersy i #endif i dołączyłem d_led.h 2 razy do 2 innych plików. I nic się nie działo. Kompilator nie pokazywał błędu. Więc pytanie: Czy to jest takie zabezpieczenie "na amen" czy symboliczne, czy w praktyce wystąpiłyby błędy?(nie próbowałem w praktyce). Myślę, że to tyle. Liczę na Wasze odpowiedzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 18:38 
Offline
Moderator
Avatar użytkownika

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

eDaro napisał(a):
i ten wers jest deklaracją zmiennej globalnej, która znajduje się w pliku tymże d_led.h . Więc teoretycznie (chyba)powinno się, przy dołączeniu tego pliku nagłówkowego do innego pliku, sprawić że każda taka zmienna bez extern i tak zostanie dołączona do innego pliku i "zrozumiana" przez kompilator, a extern sprawia, że te zmienne będą dołączone we wszystkich modułach, które d_led.h dołączą, więc (chyba) niekonieczne jest dołączanie externa.Usunąłem go i kompilator nie pokazywał błędu(ale w praktyce nie sprawdziłem). Więc powinno się użyć w takiej sytuacji externa? Czy błąd wystąpi w praktyce, a w kompilatorze nie?


A próbowałeś przeczytać w książce czym się różni deklaracja od definicji ZMIENNEJ ? bo pisze kolega tak - jakby w książce w ogóle tego tematu nie było poruszonego ... i stąd potem takie kuriozalne wnioski, że bez extern też mi działa - to po co ten extern? :( Jak nie dasz extern to masz pan DEFINICJĘ zmiennej ... rozumiesz ?

i nie mogło nie być błędu jeśli gdziekolwiek w kodzie w pliku *.c masz również definicję ... więc przede wszystkim coś mocno źle robisz

albo ... albo tak jak niektórzy początkujący uznajesz, że gdy się pokażą warningi i drugi raz puścimy kompilację - to wtedy one znikają i znaczy że jest cacuni że nie ma już warningów ... a to znowu nie to ... Bo po drugiej kompilacji BEZ ZMIAN w kodzie kompilator dostaje od ciebie INFO, cicho tam! ... mi warningi nie przeszkadzają


Autor postu otrzymał pochwałę

_________________
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: 11 sie 2014, o 18:46 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 24 lip 2014
Posty: 24
Pomógł: 0

W sumie to czytałem dawno i zapomniałem całkiem, ale widzę że muszę ponownie przeczytać, zanotować i zrozumieć. Dziękuję za odpowiedź. A te 2 pozostałe pytania to mógłby mi ktos napisać dlaczego tak jest?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 18:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lip 2013
Posty: 208
Lokalizacja: Kielce
Pomógł: 15

Za SEG_A masz przy kompilacji podstawiane (1<<0). Na tym etapie nie ma najmniejszego sensu jaki to port. Bo przeciez potem w programie w kodzie piszesz: np. PORTA |= SEGA; co jest podstawiane jako PORTA |= (1<<0) --> no to już kompilator wie ze to port A, bo PORTA |= (1<<0) to to tamo co PORTA |=(1<<PA0). Niech kolega podejrzy sobie pliki nagłówkowe dowolnej np ATMEGI, tam
są właśnie zdefiniowane piny procesora PA0 jako 0, PA1 jako 1, PB0, PC0, PD0 jako 0.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 19:00 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 24 lip 2014
Posty: 24
Pomógł: 0

Ok, dziękuję za odpowiedzi. Te definicje i deklaracje przyznaje, że olałem, że nie przypomniałem ich sobie tylko operowałem intuicyjne, a powinno być świadomie i to był mój duży błąd, co do tych przsunięć, w głowie rozjaśniło mi się ;) Co do 3 pytania dziwnie byłoby na pewno usunąć te ifndefy, ale jestem wscibski i niezaszkodzi wiedzieć czy to coś zmieni.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 19:50 
Offline
Moderator
Avatar użytkownika

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

eDaro napisał(a):
ale jestem wscibski i niezaszkodzi wiedzieć czy to coś zmieni


to jest bardzo dobra postawa ... ja też uważam, że zawsze warto coś sprawdzać samemu tak aby zrozumieć to do końca ...

ale ... no ale niebezpieczne bywa - wyciąganie wniosków pochopnych ... jak już mówiłem wyżej .. bo nie wszystko sprowadza się do warningów tak naprawdę a z drugiej strony tu chodzi o pewne specyficzne sytuacje takiego wielokrotnego inkludowania, które pewnie też w programach początkującego nie zawsze wystąpią ...

dlatego gdy ja się uczyłem i ktoś mi mówił że tak się robi w C ... to tego starałem się trzymać nawet na początku nie rozumiejąc do końca o co chodzi - za to później ... łatwiej było mi to zrozumieć ...

Pomyśl sobie - coś musi w tym być skoro nawet sam Eclipse jako edytor wstawia automatycznie za nas te IF_DEF'y ... na wszelki wypadek gdyby programista zapomniał ... więc na przyszłość tym się kieruj a nie tym, że ci warnigów nie wywaliło to znaczy że bez nich też jest OK

Zobacz na przykład ilu ludzi w necie pisząc swoje programy w C ... inkluduje pliki źródłowe *.c !!! ... i też w wielu przypadkach im to działa i żadnych warnigów nie ma ... uważasz że dobrze robią ? ;) ....

_________________
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: 13 sie 2014, o 11:46 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 24 lip 2014
Posty: 24
Pomógł: 0

Nie nie robią dobrze, bo między .c a .h jest różnica, to że eclipse dodaje te 3 wersy do inkludowanego pliku, to też znaczy że są one pewnie potrzebne. Skoro u mnie nie wywaliło błędu, to też nie wiadomo w sumie jak będzie wyglądać sytuacja w programach innych, bardziej rozbudowanych..



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 2 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