mikrocontroller.net

Forum: Compiler & IDEs Probleme mit .h Dateien


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
// Menu text
const char MT_Main[] PROGMEM                  = "Hauptmenue      ";
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
#ifndef MENU_H
#define MENU_H
...
#endif
Würde reichen, aber auch dies bringt nichts.
Wo ist mein Fehler?

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

#include "main.h"
#include "button.h"
ISR (TIMER1_COMPA_vect)
{
...
}
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

Autor: holger (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.

Nun geht es wie gewünscht.

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.