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



Teraz jest 29 mar 2024, o 05:53


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 5 cze 2018, o 18:00 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 181
Lokalizacja: Kraków
Pomógł: 30

Bardzo proszę o pomoc i podpowiedź dlaczego kompilator nie rozpoznaje typu struktury mimo, że została zadeklarowana ze specyfikatorem extern.
Tworzę program, w którym oprócz funkcji main(), mam jeszcze dwa foldery z plikami.
Folder PCF8583 zawiera pliki pcf8583.h gdzie zadeklarowałem następującą strukturę:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

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

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

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


Jak widać nic specjalnego w tych plikach nie ma, jednak po kompilacji wyskakuje błąd
../PCF8583/../TIME/time.h:7:7: error: unknown type name 'TDATETIME'
void funkcja(TDATETIME *dt, uint8_t x);
^
make: *** [PCF8583/pcf8583.o] Błąd 1
Nie mogę zrozumieć dlaczego nie rozpoznaje typu struktury mimo dodanego specyfikatora extern.

Zamieszczam jeszcze obrazek z rozmieszczenia plików w projekcie.
Obrazek
Będę wdzięczny za wszelką pomoc i wyjaśnienie na czym polega błąd.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2018, o 18:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

A skąd plik time.h może wiedzieć coś o nowym typie?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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


To, że dałeś w pliku time.c to jest za mało, a właściwie za dużo, bo wystarczy zainkludować w time.h, a potem time.h w time.c.

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


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2018, o 19:05 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 181
Lokalizacja: Kraków
Pomógł: 30

Bardzo dziękuję za podpowiedź, jakoś nie dotarło do mnie , że w plikach.h też trzeba inkludować inne pliki.h.
Dodałem
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i wszystko jest ok.
A czy mógłbyś wyjaśnić po co jeszcze dodawać bibliotekę stdint.h?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2018, o 19:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

janusz17 napisał(a):
Bardzo dziękuję za podpowiedź, jakoś nie dotarło do mnie , że w plikach.h też trzeba inkludować inne pliki.h.
Dodałem
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i wszystko jest ok.
A czy mógłbyś wyjaśnić po co jeszcze dodawać bibliotekę stdint.h?

Bardzo prosta odpowiedź: bo u mnie nie działało bez :)
Brak wpisu skutkuje błędem z nieznanym typem uint8_t.
Tak prawdopodobnie będzie w całkiem pustym projekcie, jak u mnie, Twój być może ma już więcej plików i definicja przychodzi z innymi plikami nagłówkowymi, lub masz jakieś inne opcje kompilacji, że nawet "tego nie widać".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2018, o 20:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

janusz17 napisał(a):
A czy mógłbyś wyjaśnić po co jeszcze dodawać bibliotekę stdint.h?
Zealota napisał(a):
Bardzo prosta odpowiedź: bo u mnie nie działało bez :)
Brak wpisu skutkuje błędem z nieznanym typem uint8_t.

Nie trzeba inkludować stdint.h. Problemy z brakiem definicji typu uint8_t jest zapewne spowodowany tym, że w eclipse przy tworzeniu projektu w kreatorze wybrałeś procka bądź zostawiłeś domyślny. Po prostu kreator nie do końca wszystko robi jak trzeba, a wystarczy wejść we właściwości projektu zmienić procka (jeśli był wybrany właściwy w kreatorze to trzeba wybrać inny i zatwierdzić, następnie wrócić i wybrać ponownie właściwy) i zatwierdzić. Dla tego Mirek w poradnikach sugerował by procka i taktowania nie wybierać w kreatorze, ale później ręcznie w ustawieniach projektu po zakończeniu działania kreatora - i tak trzeba tam zajrzeć by ustawić programator...
Nie wiem w czym konkretnie tkwi problem ale z tego co Mirek gdzieś kiedyś mówił to kreator nie tworzy kilku parametrów w projekcie, a ustawienie procka i zatwierdzenie powoduje że brakujące rzeczy są uzupełniane.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2018, o 21:02 
Offline
Moderator
Avatar użytkownika

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

A ja z kolei nigdy bym nie tworzył definicji typu strukturalnego w jakimś pliku specyficznym - związanym np TYLKO z RTC ... jak u ciebie "pcf8583.h"

dlaczego ? Ano dlatego, że definicję tegoż typu próbujesz wykorzystywać w innych plikach projektu, które są KOMPLETNIE jakby nie związane z tym plikem RTC ... więc jaki sens ?

Absolutnie fajnym sposobem jest np utworzenie w korzeniu projektu pliku np:

common.h i common.c

i właśnie w common.h zdefiniowanie typu za pomocą typedef, zaś w pliku common.c utworzenie definicji tejże zmiennej

a następnie INKLUDOWANIE tam gdzie trzeba czyli w plikach *.c pliku "common.h" oczywiście w logicznej kolejności np gdy tworzysz pliki sdcard.h i sdcard.c to w pliku

sdcard.c inkludujesz:

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


wtedy nawet jeśli typ będzie występował w "sdcard.h" to będzie normalnie zauważony przez kompilator

_________________
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: 6 cze 2018, o 06:26 
Offline
Moderator
Avatar użytkownika

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

Piszę w odpowiedzi do kolejnego zaczepnego żeby nie powiedzieć chamskiego wpisu gościa o nicku robespiere którego pożegnałem już po kolejnym takim wybryku z forum ..

a także celem uzupełnienia mojej powyższej wypowiedzi .... którą pisałem na szybko i oczywiście popełniłem błąd ale nie co do meritum które chciałem pokazać.

Tzn oczywiście tak jak na samym początku kolega Zelaota podpowiedział aby inkludować plik nagłówkowy w pliku nagłówkowym - to przecież nie błąd i tak się robi ... chociaż może z tym inkludowaniem "stdint.h" w plikach nagłówkowych to nie zawsze się zgodzę ale wyjaśnię jak i to widzę.

Wracając do meritum podtrzymuję co ja bym zrobił - co nie oznacza, że to jest jakiś standard czy wymóg czy cokolwiek.

Wyżej pisałem o pliku common.h w którym zdefiniowałbym sobie typ TDATETIME (można byłoby go nazwać nawet np time.h i time.c) wg mnie dla lepszej przejrzystości całego projektu, jeśli ta struktura byłaby wykorzystywana w wielu plikach projektu. Naturalnie (tu był mój błąd pod koniec wypowiedzi) ten plik time.h (czy tak jak wcześniej common.h) trzeba byłoby oczywiście zainkludować nie tylko do plików *.c które korzystają z tego typu ale także w plikach nagłówkowych gdzie ten typ występuje

tak poglądowo spróbowałem rozrysować ala graficznie pseudo projekt:
Obrazek

jak widać w korzeniu projektu jest para plików time.h i time.c To w pliku załóżmy biblioteki do karty SD, czyli w sd.h widać inkluda time.h z typem strukturalnym. Gdyby nie to, że typ występuje w argumencie funkcji to można byłoby tego inkluda dać tylko w sd.c gdzie jest ten CZERWONY numerek JEDEN. Ale przez fakt wystąpienia typu w pliku nagłówkowym trzeba jednak inkludować time.h właśnie w pliku sd.h ... ma to tę zaletę, że później już nie trzeba go inkludować w pliku sd.c

Krótko mówiąc - moja końcepcja polegała na tym, aby wydzielić taką strukturę i ew specyficzne funkcje tylko do jej obróbki np przeliczania czasu na unixowy czy inne - tylko do logicznej jednostki (pary time.c i time.h) a później korzystać z tego w tych plikach projektu gdzie zajdzie potrzeba

------------------------ [ Dodano po: 7 minutach ]

co zaś się tyczy inkludowania pliku

#include <stdint.h>

w plikach nagłówkowych - tzn konieczności tego inkluda albo nie - to proponuję sobie zrobić ciekawy eksperyment i udzielić sobie odpowiedzi, na pytanie

dlaczego w takim wypadku początku 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.


nie trzeba inkludować pliku stdint.h w widocznych tutaj plikach nagłówkowych i kompilacja przechodzi poprawnie ?

a dlaczego w takim przypadku początku 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.


kompilator zgłosi błędy, że w plikach nagłówkowych (o ile występuje typ np uint8_t) - to że jest on nieznany i uda się to rozwiązać przez właśnie zainkludowanie stdint.h ???

---------------------------

Na koniec - czy ja twierdzę, że NIGDY nie należy inkludować plików *.h w innych plikach *.h (co mi tu często zarzucają takie robespiery) ? Oczywiście, że tak nie twierdzę - tylko, że jeśli można tego uniknąć - a zagadka wyżej pokazuje w jak PROSTY sposób uniknąć konieczności inkludowania stdint.h ... co wydaje się OCZYWISTE JAK SŁOŃCE mam nadzieję, ale jeśli nie to proszę dopytać ...- więc jeśli można uniknąć to wolę nie inkludować "na zapas" ...

Bo też już nieraz widziałem kody, gdy ktoś "na zapas" - tak na wszelki wypadek inkludował wszystkie pliki systemowe jakie się tylko da bo przecież jeśli będzie ich nadmiar to nic nie szkodzi - jak tłumaczył. Ale niestety w kodzie jak się patrzyło to było (z włoskiego) "burdello bum bum" ;)

_________________
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: 6 cze 2018, o 07:30 
Offline
Użytkownik
Avatar użytkownika

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

mirekk36 napisał(a):
co zaś się tyczy inkludowania pliku

#include <stdint.h>

w plikach nagłówkowych - tzn konieczności tego inkluda albo nie - to proponuję sobie zrobić ciekawy eksperyment i udzielić sobie odpowiedzi, na pytanie

dlaczego w takim wypadku początku 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.



nie trzeba inkludować pliku stdint.h w widocznych tutaj plikach nagłówkowych i kompilacja przechodzi poprawnie ?

a dlaczego w takim przypadku początku 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.



kompilator zgłosi błędy, że w plikach nagłówkowych (o ile występuje typ np uint8_t) - to że jest on nieznany i uda się to rozwiązać przez właśnie zainkludowanie stdint.h ???
Dzieje się tak, ponieważ stdint.h jest dodawany w jednym z trzech pierwszych plików (obstawiam, że w io.h, ale nie mam jak sprawdzić)?
Natomiast w drugim przypadku najpierw dodawana jest zawartość plików pcf8583.h oraz sd.h, w których pojawia się typ uint8_t. A ponieważ dodawanie bibliotek powoduje "wklejenie" ich w miejscu wstawienia, więc deklaracja typuuint8_t jest później niż użycie. I kompilator zgłasza błąd :)
Mam rację?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2018, o 09:08 
Offline
Moderator
Avatar użytkownika

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

dokładnie - a przykład ten pokazuje, że wystarczy zachowywać porządek inkludowania - czyli najpierw pliki systemowe a później własne w cudzysłowach i okaże się, że nie trzeba inkludować stdint.h

_________________
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: 6 cze 2018, o 14:04 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 181
Lokalizacja: Kraków
Pomógł: 30

Bardzo dziękuję wszystkim za pomoc w rozwikłaniu mojego problemu.
Muszę przyznać, że nie wiedziałem i nigdy się jak dotąd nie spotkałem z inkludowaniem innych plików , w pliku.h. Nawet sądziłem, że takie dołączanie plików jest błędne.
Jednak teraz żeby jeszcze lepiej zrozumieć jak to jest z tym inkludowaniem, przerabiam ten mój przykład na różne warianty i "odkryłem" jeszcze dwie sytuacje dla mnie dziwne.
1. Jeśli w takim układzie folderów i plików jak miałem na początku, w pliku time.c napiszę sobie taką funkcję
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

a w pliku time.h, w jej deklaracji pominę argument
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

wszystko kompiluje się prawidłowo i to bez dołączania pliku pcf8583.h.
Niestety nie można wtedy dodać do funkcji drugiego argumentu bo kompilator wyrzuca błąd.

2. Jeśli funkcję mam zapisaną dalej w pliku time.c , a jej deklarację zamiast umieścić w pliku time.h zapisze w pliku pcf8583.h, to o dziwo kompilator też nie zgłasza żadnych uwag. Tylko, że robi się lekki bałagan w kodzie. Natomiast mogę dodać jako argument zarówno strukturę jak i dodatkową zmienną.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2018, o 15:12 
Offline
Moderator
Avatar użytkownika

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

sorki ale co to za dziwny przypadek że tworzysz sobie gdzieś funkcję z jakimś tam argumentem (jej ciało)

a do pliku H dajesz nagłówek funkcji ale bez argumentu - wybacz ale to bez sensu - i nie wiem nad czym tu się głowić, że to nie działa właściwie

_________________
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: 6 cze 2018, o 16:11 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 181
Lokalizacja: Kraków
Pomógł: 30

Cytuj:
sorki ale co to za dziwny przypadek że tworzysz sobie gdzieś funkcję z jakimś tam argumentem (jej ciało)

a do pliku H dajesz nagłówek funkcji ale bez argumentu - wybacz ale to bez sensu - i nie wiem nad czym tu się głowić, że to nie działa właściwie


ależ ja właśnie się dziwię, że to działa i kompilator nie zgłasza żadnych uwag



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2018, o 16:44 
Offline
Moderator
Avatar użytkownika

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

Powiem krótko - chcesz się nauczyć jak należy robić żeby było prawidłowo czy rozpatrywać przypadki, dlaczego ... akurat zadziałało skoro nie powinno ...

To tak jak z ludźmi - jedni jak dotkną palcami 230V to ich "kopnie" :lol: i tak powinno być prawda ? ;) Ale sam dobrze, wiesz, że zdarzają się ludzie którzy mogą dotknąć 230V albo i więcej i ich "nie kopnie" ;) ... i co z tego wynika ? Będziesz dzielił włos na czworo i szukał sposobu "jak oszukać przeznaczenie" ;) hahahaha no wiadomo że jest jakieś wyjaśnienie ale to zależy od rezystancji naskórka itp itd

w tym przypadku - programu, nie szkoda ci czasu szukać odpowiedzi na pytanie dlaczego zrobiłem ŹLE i mi zadziałało ? .... Oczywiście jak z naskórkiem tak tutaj trzeba zdać sobie sprawę z kroków kompilacji i na ten temat robiłem oddzielny poradnik. Na etapie kompilacji pliku C, nagłówek funkcji jest potrzebny tylko po to aby ZNAĆ NAZWĘ funkcji - a argumenty w pierwszym przebiegu nie są istotne - dlatego ci to działa

_________________
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: 6 cze 2018, o 16:58 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 181
Lokalizacja: Kraków
Pomógł: 30

Cytuj:
Powiem krótko - chcesz się nauczyć jak należy robić żeby było prawidłowo czy rozpatrywać przypadki, dlaczego ... akurat zadziałało skoro nie powinno ...

Najlepiej było by wiedzieć i rozumieć jedno i drugie.
Ale na tym etapie problem rozwiązany, wiec jeszcze raz dziękuję za wszelkie wskazówki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2018, o 17:27 
Offline
Moderator
Avatar użytkownika

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

janusz17 napisał(a):
Najlepiej było by wiedzieć i rozumieć jedno i drugie.

Podałem przecież wyjaśnienie ;) chodzi o nazwę funkcji na etapie czerpania informacji z pliku *.h dlatego działa - ale jak sam zauważyłeś robi się bajzel w kodzie ;)

_________________
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: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 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