Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Błędy wielokrotnej definicji, deklaracji.

Moderatorzy: Jacek Bogusz, Moderatorzy

Sławek5
-
-
Posty: 485
Rejestracja: 15 sie 2003, o 16:40
Lokalizacja: Szczecin
Kontaktowanie:

Błędy wielokrotnej definicji, deklaracji.

Postautor: Sławek5 » 26 wrz 2006, o 12:51

Cześc.
Powiedzcie mi o co chodzi mam plik a wnim zapis.
main.c

Kod: Zaznacz cały

typedef struct _tag_complex_t { int16_t r; int16_t i; } complex_t;
W drugim pliku FFT.h jest zapis:

fft.h

Kod: Zaznacz cały

extern typedef struct _tag_complex_t { int16_t r; int16_t i; } complex_t;
W pliku main.c jest zapis #include"fft.h"

Podczas kompilacji wyskakuje pełno błędów:

Kod: Zaznacz cały

Build started 26.9.2006 at 13:43:50 avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -O0 -MD -MP -MT main.o -MF dep/main.o.d -c ../main.c In file included from ../main.c:33: ../ffft.h:15: error: multiple storage classes in declaration of `complex_t' ../main.c:37: error: redefinition of `struct _tag_complex_t' ../main.c:40: error: redefinition of typedef 'complex_t' ../ffft.h:15: error: previous declaration of 'complex_t' was here make: *** [main.o] Error 1 Build failed with 4 errors and 1 warnings...
Co jest nie tak, jak to naprawić i dlaczego tak jest.

Sławek

Awatar użytkownika
tasza
-
-
Posty: 456
Rejestracja: 17 sty 2005, o 10:52

Postautor: tasza » 26 wrz 2006, o 14:00

a spróbuj całość tego wpisu w main.c objąć komentarzem /* */,
a w pliku fft.h zakomentuj tylko słowo kluczowe extern...
skoro main.c inkluduje fft.h to będzie definicje tego typu ciągle widział...

tasza

Awatar użytkownika
bis
-
-
Posty: 134
Rejestracja: 12 maja 2005, o 08:11
Lokalizacja: Warszawa

Postautor: bis » 26 wrz 2006, o 14:19

Tak dla ścisłości opisu jest to deklaracja typu (strukturalnego w tym przypadku). Deklaracje są informacją dla kompilatora. Definicje tworzą "obiekty" programu np. zmienne czy funkcje. Slowo "extern" pozwala odróżnić czy dalszy zapis jest definicją czy deklaracją (oczywiście markuje deklarację). Słowo "typedef" samo w sobie oznacza deklarację. Złożenie "extern typedef" jest trochę na wyrost, pewnie z nadgorliwości programisty. Kompilator buntuje się Tobie bo te same typy (ich nazwy symboliczne) są deklarowane wielokrotnie (w kilku miejscach programu). Musisz doprowadzić do sytuacji gdy w toku kompilacji pliku (wraz z "includami") typy deklarowane są jednokrotnie.

Z postaci listingu domniemuję że jakiś problem może też stanowić fakt że w trakcie kompilacji najpierw "incudowałeś" plik "fft.h" a potem jakiś inny gdzie są deklarowne typy "int16_t". I kiedy pierwszy raz przerabiał "fft.h" to całkiem coś nie poszło z "complex_t". Ale to tylko przypuszczenie.

bis

dodane:
Te przypuszczenia są całkowicie błędne. Uwaga w listingu "multiple storage.." oczywiście dotyczy wyłącznie złożenia "extern typedef" które jest w tym kompilatorze traktowne jako błąd.

a_antoniak
-
-
Posty: 645
Rejestracja: 13 sty 2005, o 18:38
Lokalizacja: Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 26 wrz 2006, o 15:10

To i ja wtrace 3 grosze :) :

Tutaj:

Kod: Zaznacz cały

typedef struct _tag_complex_t { int16_t r; int16_t i; } complex_t;
mowisz, ze slowo complex_t jest nazwa typu (jak char czy int). I bardzo slusznie.



Tutaj zas (pomijam bezsensowne typedef):

Kod: Zaznacz cały

extern struct _tag_complex_t { int16_t r; int16_t i; } complex_t;
mowisz, ze slowo complex_t nie jest typem, lecz nazwa zmiennej (akurat zdefiniowanej gdzies tam, niekoniecznie w bierzacym pliku - ale to szczegol). To jest pomieszanie z poplataniem. To tak jakbyz zmienna chcial nazwac char :).

Sławek5
-
-
Posty: 485
Rejestracja: 15 sie 2003, o 16:40
Lokalizacja: Szczecin
Kontaktowanie:

Postautor: Sławek5 » 26 wrz 2006, o 16:09

Zrbiłem jak radzi tasza i w pliku fft.h nie rozpoznaje definicji

Kod: Zaznacz cały

void fft_execute (complex_t *);
Podaje błąd:
../ffft.h:24: error: syntax error before '*' token


Fajnie wyjaśnił to a_antoniak ale wiem jak to naprawić?

Awatar użytkownika
tasza
-
-
Posty: 456
Rejestracja: 17 sty 2005, o 10:52

Postautor: tasza » 26 wrz 2006, o 17:44

ałaaa....

no, jeżeli to całe "typedef struct...." jest w pliku *.h
_przed_ "void fft_execute (complex_t *);" to dziwne to jakieś wyszło...

słuchaj, a duży to kłopot dla Ciebie zazipować to co jest teraz,
cały komplet źródeł i wstawić do posta...?
będzie jakieś pojęcie o całości a tak okruchami kodu operować to ciężko trochę...

tasza

Sławek5
-
-
Posty: 485
Rejestracja: 15 sie 2003, o 16:40
Lokalizacja: Szczecin
Kontaktowanie:

Postautor: Sławek5 » 26 wrz 2006, o 18:45

Już wstawiam. Zwróć prosze tylko uwagę ta taki drobiask, że to wszystko działa jak uruchomisz Programmers Notepad, utwoszysz projekt i zastosujesz plik Makefile, który dołączam. A potem spróbuj usunąc Makefile i stworzyć projekt w AvrStudio i skompilować tylko źródła tznL main/c, fft.S oraz dołączonr headre files: fft.h i bars.h i dopiero tearaz pojawiaja się dziwe rzeczy. Nie wiem dlaczego ten plik Makefile pozwala na kompilację a xięty inny plik standardowy robi takie rzeczy. Wyprzedzając pytanie dlaczego nie zostawie tego tak jak jest z tym oryginalnym Makefile odpowiem tak: 1 ponieważ jest to jakas dla mnie lekcja, że coś co wygląda ok nie jest OK, 2 Wygoda, wydaje mi się że łątwiej coś testować w AvrStudio, zresztą sama rozumiesz.
Załączniki
FFT_.zip
(13.35 KiB) Pobrany 578 razy
Ostatnio zmieniony 27 wrz 2006, o 05:14 przez Sławek5, łącznie zmieniany 1 raz.

Awatar użytkownika
tasza
-
-
Posty: 456
Rejestracja: 17 sty 2005, o 10:52

Postautor: tasza » 26 wrz 2006, o 20:05

zresztą sama rozumiesz ...chyba?
chyba...ale to chwilowo nieistotne

Na dysku C założyłam nowy projekt 'tasza_fft' z pustym głównym plikiem main.c,
potem w pusty edytor z main.c wykonałam CTRL+V treści main.c z Twojego zipa,
do foldera wgrałam też pliki bars_array_8.h, ffft.h oraz ffft.S,

w Project Options/Custom Options dodałam -DF_CPU=16000000UL

niewielkie zmiany w main.c i ffft.h - porównaj sobie stare i nowe (z załącznika) pliki

makefile w katalogu /default został wygenerowany automatem,
Twojego w ogóle nie używałam, poza podglądnięciem tego F_CPU

Studio ustawione na AVR pt. mega32

oto raport z kompilacji:
Build started 26.9.2006 at 20:51:19
avr-gcc.exe -mmcu=atmega32 -Wall -gdwarf-2 -O3 -fsigned-char -DF_CPU=16000000UL -MD -MP -MT main.o -MF dep/main.o.d -c ../main.c
../main.c: In function `main':
../main.c:319: warning: type defaults to `int' in declaration of `aaa'
../main.c:321: warning: type defaults to `int' in declaration of `ppp'
../main.c:332: warning: integer constant is too large for "long" type
../main.c:317: warning: unused variable `adc_smp'
../main.c:317: warning: unused variable `samp'
../main.c:318: warning: unused variable `danaac'
../main.c:318: warning: unused variable `dana1'
../main.c:319: warning: unused variable `aaa'
../main.c:321: warning: unused variable `ppp'
avr-gcc.exe -mmcu=atmega32 -x assembler-with-cpp -Wa,-gdwarf2 -c ../ffft.S
avr-gcc.exe -mmcu=atmega32 main.o ffft.o -o tasza_fft.elf
avr-objcopy -O ihex -R .eeprom tasza_fft.elf tasza_fft.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex tasza_fft.elf tasza_fft.eep

AVR Memory Usage
----------------
Device: atmega32

Program: 3406 bytes (10.4% Full)
(.text + .data + .bootloader)

Data: 985 bytes (48.1% Full)
(.data + .bss + .noinit)


Build succeeded with 9 Warnings...

a spakowany projekt jest w załączniku

tasza
Załączniki
tasza_fft.zip
(32.99 KiB) Pobrany 647 razy

Sławek5
-
-
Posty: 485
Rejestracja: 15 sie 2003, o 16:40
Lokalizacja: Szczecin
Kontaktowanie:

Postautor: Sławek5 » 27 wrz 2006, o 05:12

CZeść. Dzięki.
to stwierdzenie chyba to taki wielki skrót myslowy, ostatnio popularny choc niezamierzony przeze mnie. czasami wyrażam (piszę) coś innego niż w ogóle mam zamiamiar i potem wychodzi coś głupiego.

A wracając do błędów, czy możesz mi powiedzieć o co chodzilo dlaczego zgłaszał takie błędy?

A tak ogólnie to chciałem Cię Tasza przeprosić ponieważ wysłałem plik które słuzyły mi do testowania czasów realizacji funkcji. One zbytnio sie nie rózniły od orygnalu tylko było tam parę zmiennych pododawanych do badania wyników przetwornika A/C. Dopero teraz jak wkleiłaś wynik kompilacji zobaczyłem, ale lepiej późno niz w cale.


A Czy ja dobrze zauważyłem, że zmieniłaś troszke deklaracje stukturu w main.c i fft.h


Dodano po chwili.
Zmieniłem w oryginale to co zauważyłem u Ciebie (te zmiany) i nic dalej to samo o co tu chodzi???

Awatar użytkownika
tasza
-
-
Posty: 456
Rejestracja: 17 sty 2005, o 10:52

Postautor: tasza » 27 wrz 2006, o 10:54

/* Defs for using Fixed-point FFT module */
#include "ffft.h"
#include "bars_array_8.h"

//tasza++
//tasza typedef struct _tag_complex_t {
//tasza int16_t r;
//tasza int16_t i;
//tasza } complex_t;
//tasza--


void fft_input (const int16_t *, complex_t *);
void fft_execute (complex_t *);
ten cudak został zakomentowany, ponieważ ja mam taką manierę,
że deklaracje typów zawsze umieszczam w plikach nagłówkowych

main.c musi wiedziec co to jest complex_t, a ponieważ
dołącza ffft.h - stamtąd się dowie
#ifndef FFFT_ASM /* for c modules */
#include <inttypes.h>

//tasza++
//tasza extern typedef struct _tag_complex_t {
//tasza int16_t r;
//tasza int16_t i;
//tasza } complex_t;
//tasza--


//tasza++ dodane
typedef struct {
int16_t r;
int16_t i;
} complex_t;
//tasza--

#ifndef INPUT_NOUSE
w załączniku cały projekt ponownie - na bazie Twojego,
kompilowany na zupełnie innej maszynie, poprawki naniosłam jak w poście powyżej...

to się powinno (musi...) u Ciebie skompilować...

aha, WinAVR: 20060421, Studio: 4.12+SP3

tasza
Załączniki
fft_nowe.zip
(33.49 KiB) Pobrany 652 razy

Sławek5
-
-
Posty: 485
Rejestracja: 15 sie 2003, o 16:40
Lokalizacja: Szczecin
Kontaktowanie:

Postautor: Sławek5 » 27 wrz 2006, o 11:52

spytam sie jeszcze o użycie optymalizacji. Jaki ty stosujesz i czy są jakieś wskazówki uzycia poszczególnych typów.
Ty zastosowałaś -O3, w innych jest -Os, a przyznam, ze nie wiem który kiedy zastosować.

Awatar użytkownika
tasza
-
-
Posty: 456
Rejestracja: 17 sty 2005, o 10:52

Postautor: tasza » 27 wrz 2006, o 12:32

optymalizacja...no cóż
u Ciebie w oryginalnym makefile było -O3 to ja wstawiłam to samo,
aby warunki kompilacji były podobne...
ja nie mam z optymalizacją jakichś wielkich doświadczeń, z reguły wyłączam.

aha, no może trochę off-topic, ale to extern typedef struct mi nie daje spokoju...
szkoda mi trochę tę pisaninę teraz do kosza wyrzucać więc:

struct - słowo kluczowe, służace do budowania bardziej skomplikowanych
bloków danych - struktur, zawierających składniki różnych typów...

zapis:

Kod: Zaznacz cały

struct TStruktura { char a; char b; } zmienna, inna_zmienna, i_jeszcze_inna;
utworzy trzy zmienne strukturalne: zmienna, inna...,i_jeszcze...
każda z nich będzie miała dwa składniki a, b
przy okazji nowy typ danej dostanie nazwę TStruktura.

zmienne 'są gotowe do użycia' - ich instancje fizycznie istnieją...

możemy też utworzyć (zdefiniować) zmienną typu TStruktura,
specyfikacja C wymaga wtenczas zapisu:

Kod: Zaznacz cały

struct TStruktura zupelnie_inna;
struktury mogą też nie posiadać nazwy typu...przykładowo:

Kod: Zaznacz cały

struct { char aa; char bb; } nienazwana, druga_nienazwana;
powyżej zdefiniowane dwie zmienne strukturalne, posiadające po dwa pola aa,bb

teraz typedef....

dłuży do deklarowania nowych typów danych,
ewentualnie nazywania po swojemu aktualnie istniejących...

składnia:
typedef bardzo_skomplikowana_deklaracja nazwa_typu

np.:

Kod: Zaznacz cały

typedef unsigned char BAJT;
możemy teraz tworzyć zmienne typu BAJT...ot, po prostu:

Kod: Zaznacz cały

BAJT pierwszy_bajt = 111;
popatrzmy teraz na taki zapis:

Kod: Zaznacz cały

typedef struct _tag_paczka_ { char q; char a; char z; } TPaczka;
ale może w ten sposób:
typedef struct _tag_paczka_ {char q; char a; char z; } TPaczka;
co należy do struct-a, a co do typedef-a...?
w ten sposób zadeklarowaliśmy nowy typ danych, o nazwie TPaczka, będący strukturą
o budowie jak na zielono...
korzystać z tego typu możemy dwojako:
dzięki użyciu typedef - zwyczajnie i intuicyjnie:

Kod: Zaznacz cały

TPaczka pierwsza_paczka; pierwsza_paczka.a = 11;
dzięki identyfikatorowi _tag_paczka_ po słowie kluczowym struct, także i tak:

Kod: Zaznacz cały

struct _tag_paczka_ druga_paczka; druga_paczka.z = 22;
czyli jak w klasycznym C

mam nadzieję, że to jakieś zrozumiałe wyszło..

w załączniku spakowany plik test.c - kompiluje się go wołając z konsoli 'avr-gcc test.c'

tasza
Załączniki
test.zip
(415 Bajtów) Pobrany 458 razy

Sławek5
-
-
Posty: 485
Rejestracja: 15 sie 2003, o 16:40
Lokalizacja: Szczecin
Kontaktowanie:

Postautor: Sławek5 » 27 wrz 2006, o 15:31

Ja chya wiem o co chodzi, ale chcę się upewnić.

Czy po jakiejkolwiek zmianie w pliku musze przed kliknięciem na build [F7] zapisać plik tzn zamin dam build klik na zapisz wszystko, czy AvrStudio nie zapisuje plików po edycji automatycznie?

Awatar użytkownika
tasza
-
-
Posty: 456
Rejestracja: 17 sty 2005, o 10:52

Postautor: tasza » 27 wrz 2006, o 15:45

aż sprawdziłam....

jakakolwiek modyfikacja od chwili zapisania pliku
dostawia gwiazdkę do nazwy, to oznacza: zmieniony ale niezapisany

polecenie Build / Rebuild All - nakazuje też zapisać zmodyfikowane pliki na dysk,
potem na to napuszczany jest kompilator

opcji, która zmienia to zachowanie w ustawieniach środowiska nie znalazłam

tasza

ps.
podejrzewasz, że zmieniałeś tylko 'na ekranie', a kompilowało się z dysku.....?

Sławek5
-
-
Posty: 485
Rejestracja: 15 sie 2003, o 16:40
Lokalizacja: Szczecin
Kontaktowanie:

Postautor: Sławek5 » 27 wrz 2006, o 16:35

Zmieniałem różne wplisy w plikach i cały czas po kliknieciu na build generoały sie te same błędy. Przypadkiem nacisnąłem save i potem build i sie skompilowało bez błędu. Nie rozumiem tego

Awatar użytkownika
tasza
-
-
Posty: 456
Rejestracja: 17 sty 2005, o 10:52

Postautor: tasza » 27 wrz 2006, o 16:36

czy masz zainstalowany Service Pack na AVR Studio?

tasza

Sławek5
-
-
Posty: 485
Rejestracja: 15 sie 2003, o 16:40
Lokalizacja: Szczecin
Kontaktowanie:

Postautor: Sławek5 » 27 wrz 2006, o 16:59

TAK.
mam zsinstalowna tą werje do której podałaś mi link oraz SP3

szymel
-
-
Posty: 212
Rejestracja: 16 sty 2005, o 16:42
Lokalizacja: Włocławek

Postautor: szymel » 27 wrz 2006, o 18:54

aż sprawdziłam....

jakakolwiek modyfikacja od chwili zapisania pliku
dostawia gwiazdkę do nazwy, to oznacza: zmieniony ale niezapisany

polecenie Build / Rebuild All - nakazuje też zapisać zmodyfikowane pliki na dysk,
potem na to napuszczany jest kompilator

opcji, która zmienia to zachowanie w ustawieniach środowiska nie znalazłam

tasza

ps.
podejrzewasz, że zmieniałeś tylko 'na ekranie', a kompilowało się z dysku.....?
Przy Build i Build All , "updatowane" są tylko pliki , znajdujące się w folderach/zakładkach projektu Source Files i Header Files. Inne - widoczne np. External Dependencies - po dokonaniu zmian w kodzie , należy zapisać na dysk "ręcznie".
I tu mała uwaga. Jeśli jakiś plik nagłówkowy "dopiszemy" w projekcie do Header Files , to po 1-szej kompilacji projektu , ten sam plik będzie również znajdował się w External Dependencies.Jeżeli otworzymy go do edycji (klikając jego nazwę) , w zakładce/folderze External Dependencies , to poprawki nie będą automatycznie nanoszone na dysk , ale gdy wybierzemy go z Header Files , to wszystkie poprawki będą zapisywane do pliku , przed kompilacją.
Mam nadzieję , że nie zagmatwałem zbytnio ;)

Piotrek

PS
Pliki otwierane za pomocą opcji Open File ... , a nie znajdujące się w projekcie , też się nie "poprwaiają" przed kompilacją ;)

longos4
-
-
Posty: 3
Rejestracja: 23 lut 2010, o 15:43
Lokalizacja: Poznań

Postautor: longos4 » 23 lut 2010, o 15:49

U mnie tymczasem, podczas próby kompilacji w Programmers Notepad z użyciem avr-gcc wypluwa mi takie błędy:

Kod: Zaznacz cały

"make.exe" all -------- begin -------- avr-gcc (WinAVR 20100110) 4.3.3 Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Linking: main.elf avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -std=gnu99 -MMD -MP -MF .dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref -lm main.o: In function `main': E:\Dokumenty\Elektronika\AVR_C\fft_nowe\fft_nowe/main.c:324: undefined reference to `fft_input' E:\Dokumenty\Elektronika\AVR_C\fft_nowe\fft_nowe/main.c:327: undefined reference to `fft_execute' E:\Dokumenty\Elektronika\AVR_C\fft_nowe\fft_nowe/main.c:330: undefined reference to `fft_output' make.exe: *** [main.elf] Error 1 > Process Exit Code: 2 > Time Taken: 00:03
Podczas kompilacji w AVR Studio 4 idzie już lepiej:

Kod: Zaznacz cały

rm -rf main.o ffft.o fft_nowe.elf dep/* fft_nowe.hex fft_nowe.eep Build succeeded with 0 Warnings... avr-gcc -mmcu=atmega32 -Wall -gdwarf-2 -O0 -DF_CPU=16000000UL -MD -MP -MT main.o -MF dep/main.o.d -c ../main.c In file included from ../main.c:3: ../main.c: In function 'main': ../main.c:318: warning: type defaults to 'int' in declaration of 'aaa' ../main.c:320: warning: type defaults to 'int' in declaration of 'ppp' ../main.c:331: warning: integer constant is too large for 'long' type ../main.c:320: warning: unused variable 'ppp' ../main.c:318: warning: unused variable 'aaa' ../main.c:317: warning: unused variable 'dana1' ../main.c:317: warning: unused variable 'danaac' ../main.c:316: warning: unused variable 'samp' ../main.c:316: warning: unused variable 'adc_smp' avr-gcc -mmcu=atmega32 main.o ffft.o -o fft_nowe.elf avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature fft_nowe.elf fft_nowe.hex AVR Memory Usage ---------------- Device: atmega32 Program: 4932 bytes (15.1% Full) (.text + .data + .bootloader) Data: 985 bytes (48.1% Full) (.data + .bss + .noinit) Build succeeded with 10 Warnings...
Co powoduje błędy w avr-gcc ? Korzystam z paczki wrzuconej przez tasze, bez żadnych zmian i edycji...

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 92 gości