Probleme mit .h Dateien

Gast #719192
Lesenswert?
• ▲
▼
Hallo,

ich bin recht neu in der C Programmierung und quäle mich auf der Suche 
nach dem sinnvollen Einsatz von logisch getrennten .c und .h Dateien.
Unter anderem lege ich in einer .h Datei die Texte der Menüstruktur 
(nach dem AVR-BF Projekt) an.
Diese definiere ich z.B. so:
1
// Menu text
2
const char MT_Main[] PROGMEM                  = "Hauptmenue      ";
3
const char MT_Load[] PROGMEM                  = "Laden           ";
Bisher ging alles gut, nun habe ich die Datei jedoch von 2 verschiedenen 
.c Datein aus inkludiert und erhalte den Fehler:
menu.o:(.progmem.data+0x11): multiple definition of `MT_Load'
main.o:(.progmem.data+0x11): first defined here
Ich dachte, ein einfaches
1
#ifndef MENU_H
2
#define MENU_H
3
...
4
#endif
Würde reichen, aber auch dies bringt nichts.
Wo ist mein Fehler?

Mein zweites Problem hängt mit Interupts zusammen.
button.h
1
ISR (TIMER1_COMPA_vect);      // ISR für Timer1 (500 ms Interrupt)
button.c
1
// Allgemeine Includes
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <avr/pgmspace.h>
5

6
#include "main.h"
7
#include "button.h"
8
ISR (TIMER1_COMPA_vect)
9
{
10
...
11
}
Ich erhalte immer die Warnung:
../button.h:7: warning: data definition has no type or storage class
../button.h:7: warning: type defaults to 'int' in declaration of 'ISR'
../button.h:7: warning: parameter names (without types) in function 
declaration

Ist es korrekt in den einzelnen .c Datein jeweils nochmal alle header zu 
includen, deren Inhalt ich verwenden möchte?

Noch eine letzte Frage:
Wie stelle ich das Piepen ab, wenn ich im AVR Studio eine Zeile im Build 
oder Message Fenster anklicke?

Vielen Dank für eine Antwort,

Andreas
Gast #719207
Lesenswert?
• ▲
▼
Man gibt Arrays in Header Dateien keine Werte!
Das machst du NUR in EINER menu.c

menu.c
// Menu text
const char MT_Main[] PROGMEM                  = "Hauptmenue      ";
const char MT_Load[] PROGMEM                  = "Laden           ";

menu.h
#ifndef MENU_H
#define MENU_H
 extern const char MT_Main[];
 extern const char MT_Load[];
#endif

Mein zweites Problem hängt mit Interupts zusammen.
button.h

ISR (TIMER1_COMPA_vect);      // ISR für Timer1 (500 ms Interrupt)

Du brauchst keinen Prototyp für die ISR in button.h.
Schmeiss ihn dort komplett raus.
Gast #719872
Lesenswert?
• ▲
▼
> Unter anderem lege ich in einer .h Datei die Texte der Menüstruktur
> (nach dem AVR-BF Projekt) an.

Das ist schon mal falsch.

> Diese definiere ich z.B. so:
> // Menu text
> const char MT_Main[] PROGMEM                  = "Hauptmenue      ";
> const char MT_Load[] PROGMEM                  = "Laden           ";

Wie bei Funktionen auch mußt du die Deklaration in den Header schreiben 
und die Definition in die .c-Datei.

> Ich dachte, ein einfaches
> #ifndef MENU_H
> #define MENU_H
> ...
> #endif
>
> Würde reichen, aber auch dies bringt nichts.

Das hilft nur gegen den Fall, daß du in einer .c-Datei den Header 
(direkt oder indirekt) mehrfach includierst.

> Wo ist mein Fehler?

Wie der Linker schon sagt, sind die Objekte mehrfach definiert, da die 
Definition im Heder steht und dieser in zwei .c-Dateien eingebunden ist.

> button.h
> ISR (TIMER1_COMPA_vect);      // ISR für Timer1 (500 ms Interrupt)

So kann man eine ISR nicht deklarieren. Du brauchst aber auch keine 
Deklaration im Header, da du sie ja nie aufrufst.

> Ist es korrekt in den einzelnen .c Datein jeweils nochmal alle header
> zu includen, deren Inhalt ich verwenden möchte?

Ja.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.