mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kleines Problem mit Includes


Autor: Paul (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Bei meinem aktuellen AVR-Projekt (ich benutze AVR-GCC) habe ich ein 
kleines Problem mit Include-Files.
Ich habe eine Datei "strings.h", die ein paar in anderen Includes 
verwendete Konstanten enthält.
Die möchte ich gerne in die "main.h" packen. Doch dann bekomme ich X 
Fehlermeldungen, weil die Konstanten dann anscheinend mehrfach definiert 
sind.
Jetzt muss ich das #include "strings.h" direkt in die main.c schreiben, 
dann gehts.

Nur zweifle ich jetzt irgendwie an der Wirksamkeit dieser 
"Header-Guards"
(#ifndef __STRINGS.H__
 #define
 ...
 #endif)..

Kann hier jemand vllt. kurz einen Blick in meinen Code werfen und mir 
sagen, wie ich das mit den Includes am besten löse?

Die entsprechenden Dateien (sind nur ein paar) habe ich angehängt.

Ich bin leider noch ein C-Anfänger und bekomme es wirklich nicht besser 
hin..
Wenn mir jemand helfen und sagen könnte, was Sache ist, wäre ich ihm 
sehr verbunden. ;-)

Gruß und guten Rutsch,
Paul

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die header guards sind OK, aber bitte benutze keine Namen mit
führenden Unterstrichen, diese sind für die Bibliothek und den
Compiler reserviert.  Schreib also:
#ifndef STRINGS_H
#define STRINGS_H

// ...
#endif /* STRINGS_H */

strings.h ist übrigens kein sehr schöner Name, da die Verwechslungs-
gefahr mit dem Standard-C-Header string.h ziemlich groß ist.

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Jörg,
erstmal danke für deine Antwort!

Ich hab gelesen, dass die Unterstriche besser wären, weil der Compiler 
DEFINEs mit einem führenden E z.B. für sich beansprucht (irgendwie so).
Oder macht AVR-GCC da eine Ausnahme?

Danke für den Tipp, werde die strings.h auch nochmal umbenennen. ;)

Aber wie bekomme ich es nun hin, dass ich das #include "strings.h" in 
die main.h schreiben kann?
Ich bin, wie gesagt, sehr unsicher mit diesen ganzen includes. Vllt kann 
man das besser lösen?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Paul (Gast)

>Aber wie bekomme ich es nun hin, dass ich das #include "strings.h" in
>die main.h schreiben kann?

???
Schreibs doch einfach rein.
#inlcude "my_strings.h"

>Ich bin, wie gesagt, sehr unsicher mit diesen ganzen includes. Vllt kann
>man das besser lösen?

Ja. Deine Fehler liegen

a) and er falschen Syntax: in WINAVR wird das so gemacht.

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

b) am falschen Konztept. Was du in deiner string.h hast sind globale 
Variablen. Die werden anders gehandhabt. Stichwort EXTERN.

in my_string.h kommt dann

// Deklaration der globalen Variablen
extern char hello[] PROGMEM;

In my_string.c kommt dann

// Definition der globalen Variablen
char hello[] PROGMEM = "Hallo Welt!";

my_string.h kannst du dann überall problemlos einbinden. Solche globalen 
Variabeln bzw. Konstanten legt man üblicherweise in globals.c/h ab.

MFG
Falk

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paul wrote:

> Ich hab gelesen, dass die Unterstriche besser wären, weil der Compiler
> DEFINEs mit einem führenden E z.B. für sich beansprucht (irgendwie so).

Makros, die mit einem E beginnen, sind in der Tat potenzielle
Erweiterungen für <errno.h>.  Allerdings haben wir davon im Moment
beim AVR-GCC fast keine in Benutzung.

Nur: du hast den Teufel mit dem Beelzebub ausgetrieben.  Während die
mit dem E für weitere Fehlernamen reserviert sind (wobei mir keiner
bekannt ist, der davon jemals auf _H enden würde), sind die Makronamen,
die mit einem Unterstrich und einem Großbuchstaben beginnen sowie
alle Bezeichner, die mit zwei Unterstrichen beginnen, immer für
die interne Benutzung von Compiler und Bibliothek reserviert.

Autor: Paul Wilhelm (mosfetkiller)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mensch..hab ganz vergessen, dass ich hier ja auch angemeldet bin. ;-)
Danke euch! Es klappt jetzt alles so wie ich es haben will.

Die letzte verbliebene Frage ist nur noch, in was ich diese Zeile 
umändern muss, wenn ich prog_char gänzlich vermeiden möchte:
void print(const prog_char *str)

Ganze Funktion:
void print(const prog_char *str)
{
  while (1) {
    char lsb = (char) pgm_read_byte(str);
    if (lsb == '\0')
    return;
    remote_control(0, lsb);
    str++;
  }
}

Gruß,
Paul

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Paul Wilhelm (mosfetkiller)

>Die letzte verbliebene Frage ist nur noch, in was ich diese Zeile
>umändern muss, wenn ich prog_char gänzlich vermeiden möchte:

>void print(const prog_char *str)

Du must einen Pointer auf Daten im Flash verweden. Hab aber im Moment 
die Doku nicht parat. Steht alles recht gut erklärt in der Doku der libc 
im WINAVR. Irgendwas mit PROGMEM_P oder so.

MFG
Falk

Autor: Paul Wilhelm (mosfetkiller)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na super ;-)

Auszug aus dem PROGMEM-Kapitel der libc-Doku:
#dene PGM_P const prog_char 

Hat sich also erledigt. :P

Aber trotzdem danke. Damit wären alle meine Fragen bis auf weiteres 
beantwortet!

Gruß,
Paul

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.