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



Teraz jest 16 lut 2025, o 03:13


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 8 sty 2017, o 14:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2014
Posty: 150
Pomógł: 1

Witam,

Siedzę już jakiś czas nad kodem i nie mogę zlokalizować co jest przyczyną takiego błędu :/ Może ktoś mi podpowie od czego i gdzie zacząć szukać?

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


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


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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2017, o 14:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

W pliku d_led.h np. ten fragment kodu:
const uint8_t COLORS[]={RED, ORANGE, YELLOW ,GREEN, AQUA, BLUE, MAGENTA };// tablica z ustawionymi kolorami
to definicja czy deklaracja?

W pliku *.h umieszczamy przecież deklaracje zmiennych, w pliku *.c ich definicje, prawda?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2017, o 14:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 sty 2013
Posty: 169
Lokalizacja: Silesia - P-ce
Pomógł: 10

A sprawdzałeś w dwóch kolejnych bibliotekach - gamma, oraz makra?
Może tam się znajduje jakaś zmienna o tej samej nazwie (ewentualnie podaje je też)

Jeżeli korzystasz z Eclipse to najedź myszką na zmienna COLORS i przy naciśniętym CTRL naciśnij PKM, na tą zmienną. Powinna pokazać Ci się tabelka z wyborem gdzie ma się Eclipse przenieść - do której zmiennej. Czasami to działa;) (u mnie czasem tak działało - a czasem musiałem ręcznie wszystko przeszukiwać)

_________________
Niewiele trzeba by być szczęślwym.Wystarczy chcieć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2017, o 15:28 
Offline
Użytkownik

Dołączył(a): 10 lip 2015
Posty: 334
Pomógł: 32

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

Jeżeli nie, to dopisz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2017, o 18:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

To może inaczej...
napiszmy sobi taki oto prosty przykład, myślę, że bardzo fajnie pokazujący problem kolegi amilo_pa:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Prosty przykład, który chyba nie wymaga wyjaśnień.
A teraz chcemy przenieść co nie co do plików: test.c i test.h.

Tak jak to zrobił kolega amilo_pa:
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.


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


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


No i niestety tak to nie zadziała.
Trzeba to zrobić tak:
plik test_extern.c:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Deklaracja tablicy musi się znajdować w pliku *.h, a jej definicja w pliku *.c
Dodatkowo trzeba jeszcze użyć extern. ;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2017, o 23:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2014
Posty: 150
Pomógł: 1

Kolego @anshar pomogło i dziękuję za dokładne wyjaśnienie przyczyny złej kompilacji :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2017, o 13:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2014
Posty: 150
Pomógł: 1

Jeden problem się rozwiązał, ale pojawił się drugi :/
Otóż mam w liku d_led.h zadeklarowane makro oraz deklaracje tablicy COLORS:
d_led.h
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


a gdy próbuję wywołać makro w 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.


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


Problem znika gdy utworzę nową tablicę COLORS w main.c

Jak to obejść ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2017, o 15:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 sty 2013
Posty: 169
Lokalizacja: Silesia - P-ce
Pomógł: 10

Jeżeli dobrze myślę to gdy zdefiniujesz na stałe wielkość tablicy COLORS to problem zniknie (nie mam możliwości tego sprawdzenia).

Problem prawdopodobnie wynika (nie jestem jeszcze w te klocki dobry) z faktu, że podczas kompilowania plików, kompilator w tym miejscu (w main) gdzie masz wywołanie tego makra jeszcze nie wie, ile elementów jest w tablicy i co w niej jest. Jeżeli na początku pliku main utworzysz tą tablicę to kompilator będzie już wiedział co jest w tej tablicy.

_________________
Niewiele trzeba by być szczęślwym.Wystarczy chcieć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2017, o 18:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2014
Posty: 150
Pomógł: 1

Deklaracja rozmiaru tablicy w d_led.h przyniosła oczekiwany efekt :)
Czyli nie może być zadeklarowana tablica w pliku nagłówkowym bez jej wielkości ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2017, o 19:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 sty 2013
Posty: 169
Lokalizacja: Silesia - P-ce
Pomógł: 10

Tablica może być deklarowana bez wielkości w pliku nagłówkowym, tylko najwyraźniej żeby skorzystać, np. z sizeof w innym pliku, trzeba pewnie skorzystać z jakiejś sztuczki - niestety moja wiedza jeszcze tak daleko nie sięga.

Problem wynika z tego, że gdy nie określisz wielkości tablicy, to kompilator sam ją określa, na podstawie jej zawartości, ale dopiero gdy "wejdzie" do tego pliku. A nie wiesz w którym miejscu to nastąpi. Kompilator natomiast wie, że coś takiego jest (taka tablica), ale nie wie jeszcze ile zajmuje, bo wielkość nie została jeszcze dokładnie określona.

_________________
Niewiele trzeba by być szczęślwym.Wystarczy chcieć



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