Forum: Compiler & IDEs Probleme mit .h Dateien


von Andreas (Gast)


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

von holger (Gast)


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.

von Rolf Magnus (Gast)


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.

von Andreas (Gast)


Lesenswert?

Vielen Dank.

Nun geht es wie gewünscht.

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.