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



Teraz jest 13 maja 2026, o 17:30


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 3 gru 2015, o 19:38 
Offline
Nowy

Dołączył(a): 15 lis 2014
Posty: 7
Pomógł: 0

Mam następujące pytanie. Tworzę program, którego projekt chciałbym podzielić na następujące pliki - main.c - główny plik programu, func.c, func.h - definicje i deklaracje funkcji, macro.h - wszelkie makra, var.h - wszelkie zmienne. Teraz w func.c chciałbym napisać funkcję, do której chcę przekazać wskaźnik na strukturę, o tak:
void PID_control(PIDTYPE * str)
W którym pliku i w jaki sposób powinienem zdefiniować nowy typ PIDTYPE? Czy powinno to wyglądać, tak?
typedef struct PIDTYPE{
};
PID TYPE nowa_struktura;

Chciałbym umieścić definicję i deklarację w pliku var.h, ale tak żebym mógł stworzyć funkcję wykorzystująca ten typ w pliku func.c. Czy to w ogóle jest możliwe i poprawne podejście?

Mam nadzieję, że dobrze wyjaśniłem mój problem. Generalnie chodzi mi o zachowanie maksymalnej przejrzystości i porządku w programie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 gru 2015, o 20:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Cytuj:
var.h - wszelkie zmienne
To wygląda bardzo podejrzanie.
Cytuj:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
jest definicją i powinien znaleźć się pliku .h w tym do którego merytorycznie pasuje najlepiej. Czyli pewnie func.h.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
jest deklaracją zmiennej i musi być w pliku .c. Pewnie w main.c, bo w func.c masz ją przekazaną do funkcji jako argument.

--
Pozdrawiam,
Robert

------------------------ [ Dodano po: 1 minucie ]

Typ PIDTYPE będziesz miał dostępny w main.c i func.c po zaincludowaniu func.h.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 gru 2015, o 20:54 
Offline
Moderator
Avatar użytkownika

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

wyjaśniałem to już autorowi na blogu ale powtórzę tutaj bo będzie przejrzyściej:

panie kolego w języku C definicje zmiennych umieszcza się w plikach *.c a nie to co ty tu planujesz w pliku *. chcesz utworzyć definicję zmiennej tego typu strukturalnego.

reasumując:

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


TAKĄ definicję TYPU (uważaj - definicję TYPU a nie definicję zmiennej!) umieszczasz w swoim pliku *.h !!!

taką DEFINICJĘ zmiennej:

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


umieszczasz w swoim pliku *.c

i teraz uważaj pan jeszcze raz!!! ....

zaś DEKLARACJĘ zmiennej - taką:

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


umieszczasz w swoim pliku func.h

jasne ? (czyli zarówno DEFINICJA TYPU jak i DEKLARACJA zmiennej siedzą w *.h a tylko DEFINICJA zmiennej w *.c) i QNIEC

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

rskup napisał(a):
To wygląda bardzo podejrzanie.

Nie tylko podejrzane ale wręcz kompletnie niezgodne z językiem C. Zmienne (ściślej mówiąc DEFINICJE zmiennych) muszą być w plikach *.c natomiast ich DEKLARACJE w plikach *.h

coś czuję, przez skórę, że jak to bywa - kolega autor ma problem ze zrozumieniem czym różni się DEFINICJA zmiennej/funkcji od DEKLARACJI zmiennej/funkcji ... a do tego może troszkę miesza mu się podział plików z językiem C++ no i kłopot gotowy

dlatego polecam DOKŁADNIE poczytać Bluebooka ;) bo po nim zwykle każdy zaczyna rozumieć tę fundamentalną różnicę, która pozwala nagle rozumieć kupę rzeczy w języku C ;)
http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

_________________
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: 4 gru 2015, o 19:15 
Offline
Nowy

Dołączył(a): 15 lis 2014
Posty: 7
Pomógł: 0

Bardzo dziękuję za wyczerpującą pomoc, ale chyba nie do końca dokładnie wyjaśniłem moje intencje.
Swoją drogą Panie Mirku uwielbiam styl Pana wypowiedzi - troszkę żartobliwy, troszkę uszczypliwy. Super.

Do rzeczy.
Dobrze rozumiem różnicę pomiędzy deklaracją ("mam zamiar użyć, gdzieś, kiedyś"), a definicją ("tak wygląda moja funkcja/zmienna).
Rozumienie tej różnicy w moim przypadku nie do końca jednak pozwala na prawidłowe zastosowanie w praktyce mojej wizji.

Chciałbym podzielić program (i robić tak w przyszłych projektach) na główną część programu (main.c), na biblioteki (func.c, func.h oraz wiele innych jeśli zaistnieje taka potrzeba) oraz osobny plik/pliki ze zmiennymi globalnymi i ewentualnymi typami (np. strukturalnymi), które mam zamiar używać.
Ważne natomiast jest, aby te nowe typu były również widoczne dla funkcji w pliku func.c.

Gdyby zaistniała potrzeba użycia zmiennej globalnej w jakieś funkcji (tak nie robię, ale to tylko przykład), to po prostu DEFINIUJĘ zmienną w pliku var.c (nie .h jak zasugerowano), a następnie w pliku func.h umieszczam jej DEKLARACJĘ ze słowem extern (w końcu definicja jest w innym pliku).

To samo chciałbym zrobić ze strukturą, której typ sam stworzyłem.
Czy dobrze rozumiem, że powinno to wyglądać tak:

main.c - tutaj mam dostęp do wszystkich typów, zmiennych oraz funkcji
func.h - deklaracje funkcji
func.c - definicje funkcji
var.h - deklaracje typów, deklaracje zmiennych (ze słowem extern?)
var.c - definicje zmiennych (np. int liczba, albo PIDTYP jakas_struktura)


Dopisek:
Zrobiłem tak:

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


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


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


func.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łąd:
var.c:49:1: error: unknown type name 'PIDTYPE'



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2015, o 21:20 
Offline
Nowy

Dołączył(a): 24 wrz 2015
Posty: 14
Lokalizacja: Oława
Pomógł: 3

W func.c musi być #include "func.h", a w func.h #include "var.h".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2015, o 22:05 
Offline
Moderator
Avatar użytkownika

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

mkot123 napisał(a):
Swoją drogą Panie Mirku uwielbiam styl Pana wypowiedzi - troszkę żartobliwy, troszkę uszczypliwy. Super.

NIGDY w takich sytuacjach nie stosuję uszczypliwości, staram się wyjaśnić jak mogę i jak umiem..... Uszczypliwości przypisują mi zwykle te osoby, które ? ... no właśnie np źle zadali pytanie, a na końcu się oburzają, że ja nie rozpoznałem stopnia zaawansowania i że zwracam się jak do jakiegoś początkującego .... Tymczasem ponieważ ja sam jestem początkujący w C - to mam taki sposób, że praktycznie z każdym rozmawiam jak z początkującym - wtedy jest łatwiej ... no ale .... skoro ta cała moja wypowiedź i kurna kupa podpowiedzi to były uszczypliwości (masakra) ;) to się wyłączam .... powodzenia.

_________________
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: 4 gru 2015, o 22:35 
Offline
Nowy

Dołączył(a): 15 lis 2014
Posty: 7
Pomógł: 0

Panie Mirku, ale skąd to oburzenie.
Przecież napisałem, że uwielbiam taki styl i nie było w tym krzty sarkazmu.
Uważam, że Pana podejście jest jak najbardziej właściwie i doceniam trud oraz czas włożony w edukowanie rzeszy młodych amatorów programistów (ja jestem jednym z nich, z naciskiem na "amator" :-))

Nie miałem zamiaru Pana urazić, wręcz przeciwnie, docenić nie tylko wiedzę, ale i (moim zdaniem) oryginalny styl wypowiedzi, prezentowany również w filmach na kanale YT. Za to wielki PLUS!

Wracając jednak do tematu. Zrobiłem jak polecił korpikn, ale to niestety nie rozwiązało problemu. Nadal pojawia się ten sam błąd.
Swoją drogą, czy moja propozycja z wyrzuceniem wszystkich zmiennych do osobnego pliku to dobre rozwiązanie? Czy nie jest zbyt przekombinowane?
Gdzie Waszym zdaniem powinienem definiować zmienne globalne?
Mój pomysł wynika wprost z poradników Pana Mirka, który zawsze przywiązuje dużą uwagę do przejrzystości i porządku w kodzie. Nie wiem jednak, czy przypadkiem nie przekombinowałem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2015, o 23:16 
Offline
Moderator
Avatar użytkownika

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

mkot123 napisał(a):
Nadal pojawia się ten sam błąd.

Posłuchaj, zwracaj uwagę gdzie pojawia się ten błąd, czyli w jakim pliku. A ty tylko mówisz nam że on znowu występuje ....

Postaraj się zrozumieć to co poradził ci kolega korpikn ... a poradził dobrze ....

toż skoro masz w pliku func.h DEKLARACJE funkcji w których wykorzystujesz w argumentach typ PIDTYPE to jak myślisz? skąd kompilator ma wiedzieć na etapie pierwszego sprawdzania pliku przed kompilacją co to za nazwa ? skoro w tym pliku jej nie ma zdefiniowanej ani nie ma żadnego inkluda z którego wynikałaby ta definicja ....

Więc skoro dodałeś to co podpowiedział kolega , a błąd nadal występuje to pewnie też w komunikatach w Console masz także nazwę pliku w którym to się dzieje a nawet sam Eclipse pewnie to sygnalizuje znacznikami ....

pewnie tam też nie ma tego inkluda

Tak w ogóle to zastanów się .... czy ten typ jest charakterystyczny i powiązany tylko z plikami func.* ? bo jeśli tak to umieszczanie zarówno typu PIDTYPE jak i zmiennej tego typu w jakimś innym trzecim rodzaju plików var.* jest na pewno właśnie przekombinowaniem

No chyba, że będzie on wykorzystywany w wielu innych plikach projektu

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

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