www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik const struct Initialisierung


Autor: Timebeast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
static const char Hauptmenu_0[] = "Ausschalten";
static const char Hauptmenu_1[] = "Optionen";
static const char Hauptmenu_2[] = "Kalibrierung";

//Struktur der einzelenen Einträge
typedef struct {
  const char *text;
  unsigned char next;
  unsigned char prev;
} menu_struct;

//Struktur initialisieren
const menu_struct menue[] = {
  {Hauptmenu_0, 1, 2},
  {Hauptmenu_1, 2, 0},
  {Hauptmenu_2, 0, 1},
};

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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort: Include guards ...

#ifndef MENU_H
#define MENU_H

// Dein Kram

#endif MENU_H /* MENU_H */

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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
//Struktur der einzelenen Einträge
typedef struct {
  const char *text;
  unsigned char next;
  unsigned char prev;
} menu_struct;

extern const menu_struct menue[];
gehört in ein Haeder-File.

Und dies
static const char Hauptmenu_0[] = "Ausschalten";
static const char Hauptmenu_1[] = "Optionen";
static const char Hauptmenu_2[] = "Kalibrierung";

//Struktur initialisieren
const menu_struct menue[] = {
  {Hauptmenu_0, 1, 2},
  {Hauptmenu_1, 2, 0},
  {Hauptmenu_2, 0, 1},
};
gehört in ein C-File.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du die Regel

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

befolgst, passiert so etwas nicht.

Autor: Timebeast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Jaeger (pnuebergang)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.