Forum: Mikrocontroller und Digitale Elektronik const struct Initialisierung


von Timebeast (Gast)


Lesenswert?

Hallo Leute,
ganz komischer Fehler, vorweg, ich arbeite mit einem ATmega32 unter AVR 
Studio mit GCC.
Ich bin gerade dabei mir ein LCD Menu zu schreiben.
Folgendes hab ich bisher geschrieben:
1
static const char Hauptmenu_0[] = "Ausschalten";
2
static const char Hauptmenu_1[] = "Optionen";
3
static const char Hauptmenu_2[] = "Kalibrierung";
4
5
//Struktur der einzelenen Einträge
6
typedef struct {
7
  const char *text;
8
  unsigned char next;
9
  unsigned char prev;
10
} menu_struct;
11
12
//Struktur initialisieren
13
const menu_struct menue[] = {
14
  {Hauptmenu_0, 1, 2},
15
  {Hauptmenu_1, 2, 0},
16
  {Hauptmenu_2, 0, 1},
17
};

So wunderbar, funktioniert auch solange ich alles in der main.h 
definiere. Lagere ich dies allerdings aus, z.B. in menu.h, und 
includiere das ganze in "main" meckert der Compiler "menu.o:(.data+0x0): 
multiple definition of `menue'".

Ich meine, klar, es sind Konstanten und wenn die dann includiert werden 
von main macht er wahrscheinlich ne Kopie, tja, und dann hab ich ne 
multiple definition...
Meine Frage nun, wie kann ich das umgehen? #ifndef #define vielleicht? 
Ich meine klar, einfach ne "main.h" definieren und dann die Struktur 
dort initialiesieren, aber ich wollte eigendlich eine Datei wo alle 
Sprachspezifieschen Einstellungen drin stehen, halt der Header des 
Menues.

Vielleicht hat ja jemand ne Idee...

Gruß
Ralf

von Alex (Gast)


Lesenswert?

Stichwort: Include guards ...

#ifndef MENU_H
#define MENU_H

// Dein Kram

#endif MENU_H /* MENU_H */

von Stefan E. (sternst)


Lesenswert?

@ Alex:

Das schützt aber nicht vor "multiple definition".

@ Timebeast:

In ein Header-File packt man nur die Deklarationen, die Definitionen in 
ein C-File.

Dies
1
//Struktur der einzelenen Einträge
2
typedef struct {
3
  const char *text;
4
  unsigned char next;
5
  unsigned char prev;
6
} menu_struct;
7
8
extern const menu_struct menue[];
gehört in ein Haeder-File.

Und dies
1
static const char Hauptmenu_0[] = "Ausschalten";
2
static const char Hauptmenu_1[] = "Optionen";
3
static const char Hauptmenu_2[] = "Kalibrierung";
4
5
//Struktur initialisieren
6
const menu_struct menue[] = {
7
  {Hauptmenu_0, 1, 2},
8
  {Hauptmenu_1, 2, 0},
9
  {Hauptmenu_2, 0, 1},
10
};
gehört in ein C-File.

von Alex (Gast)


Lesenswert?

Unabhängig davon definiert man Variablen in Source-Modulen und 
deklariert sie in Headern.

Und eine static Variable im Header macht erst recht keinen Sinn.

von yalu (Gast)


Lesenswert?

Wenn du die Regel

  "In Header-Files kommen nur Deklarationen, keine Definitionen."

befolgst, passiert so etwas nicht.

von Timebeast (Gast)


Lesenswert?

Tjajaja, Grundlagen der Programmierung, ne Variablen Definition im 
Header, man man man, so doof war ich ja noch nie, erstaunlich :-(

Ihr habt natürlich völlig Recht, aber es zeigt sich mal wieder, kein 
Fehler ist abstrakt genug um nicht gemacht zu werden. ;-)

Vielen vielen Dank nochmal...

Gruß
Ralf

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Und wenn du damit fertig bist, dann lese mal was über PROGMEN in der 
GCC-Dokumention.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.