RTV forum PL | NewsGroups PL

Wykorzystanie tablicy wskaźników do stringów w projekcie AVR-GCC błąd linkera

[avr-gcc] programowanie strukturalne vs linker

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Wykorzystanie tablicy wskaźników do stringów w projekcie AVR-GCC błąd linkera

Pawel Kurzawa
Guest

Thu Nov 18, 2004 5:21 pm   



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 Sad
Jak temu zaradzic? Funkcje te sa wywolywane z jednego miejsca
i moglbym przekaza tablice przy wywolywaniu, ale nie chce za bardzo
komlikowac
wywolania :)

--
--
Best regards
K@pW from Poland

kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------

Andy
Guest

Thu Nov 18, 2004 5:30 pm   



Użytkownik "Pawel Kurzawa" <groups@kpw.qs.pl> napisał w wiadomości news:cnilni$iak$1@atlantis.news.tpi.pl...
Quote:
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 Sad
Jak temu zaradzic? Funkcje te sa wywolywane z jednego miejsca
i moglbym przekaza tablice przy wywolywaniu, ale nie chce za bardzo
komlikowac
wywolania :)


jesli definicje tablicy masz w h
i to h includujesz do kilku c
to linker widzi wiele obiektow o tej samej nazwie


tablice daj do c a w h daj extern

np.

extern char * tab[10];

--
Andrzej

J.F.
Guest

Thu Nov 18, 2004 6:29 pm   



On Thu, 18 Nov 2004 18:21:18 +0100, Pawel Kurzawa wrote:
Quote:
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 Sad
Jak temu zaradzic?

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

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

J.

Adam Dybkowski
Guest

Thu Nov 18, 2004 10:51 pm   



Pawel Kurzawa wrote:

Quote:
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

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.

--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/

Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.

Jurek Szczesiul
Guest

Fri Nov 19, 2004 6:52 am   



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

Quote:
[..] 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.

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.


--
Pozdrowienia
Jurek Szczesiul

elektroda NewsGroups Forum Index - Elektronika Polska - Wykorzystanie tablicy wskaźników do stringów w projekcie AVR-GCC błąd linkera

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map