[avr-gcc] programowanie strukturalne vs linker

Witam, mam kilka funkcji w roznych plikach, i chce w nich skozystac z tablicy wskaznikowo do stringow w pamieci programu. umiescilem taka tablice w pliku naglowkowym dolaczylem do plikow w ktorych siedza funcje ktore kozystaja z tej tablicy i kasztan. Przy kompilacji linker wywala mnostwo dziwnych bledow :( Jak temu zaradzic? Funkcje te sa wywolywane z jednego miejsca i moglbym przekaza tablice przy wywolywaniu, ale nie chce za bardzo komlikowac wywolania :)

Reply to
Pawel Kurzawa
Loading thread data ...

w pliku .h masz miec definicje "extern ....".

W jednym z plikow .c masz miec definicje samych zmiennych bez extern.

J.

Reply to
J.F.

Błąd. Podstawowa zasada: w plikach nagłówkowych (.h) umieszczamy wyłącznie definicje preprocesora (#define), definicje typów, struktur, enumów itp, prototypy funkcji (nazwa i parametry bez ciała funkcji), funkcje static inline i externy zmiennych. Ogólnie mówiąc wszystko, co samo z siebie nie powoduje wygenerowania kodu ani inicjowanych danych tudzież constów.

Cała reszta może się znaleźć dopiero w plikach źródłowych (.c), włączając ciała funkcji, deklaracje stałych / tablic / zmiennych inicjowanych.

Czyli w powyższym konkretnym przypadku: tablicę musisz umieścić w pliku .c, a w pliku .h tylko deklarację dołączenia jej z zewnątrz (extern). Linker sobie z tym poradzi.

Reply to
Adam Dybkowski

Thu, 18 Nov 2004 23:51:04 +0100, na pl.misc.elektronika, Adam Dybkowski napisał(a):

Jeśli ktoś lubi jednak dane globalne w jednym miejscu, to można je upchnąć we wspólnym nagłówku *.h. Zmienne inicjalizowane ( albo wyposażone w atrybut jak np. noinit ) deklarujemy alternatywnie : #ifdef MAINMOD char zm = 8; #else extern char zm; #endif Nagłówek dołączamy do wszystkich plików a tylko w jednym ( np. głównym ) definiujemy MAINMOD. BTW - wcześniejsze wersje AFAIR wymagały tego też dla zmiennych bss - zerowanych; teraz działa wielokrotna deklaracja nie powodując wrzawy linkera.

To tip z Avrfreaks - by Eric Weddington.

Reply to
Jurek Szczesiul

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.