ANSI-C: Zugriff auf zentrale (Bitfeld-) Struktur?

Tensi

Mitglied
Hallo,

ich möchte auf eine Struktur die in eienem eigenen Header-file liegt, von verschiedenen Funktionen aus die sich in verschiedenen Source-files befinden, zugreifen.
Die Struktur könnte z. B. so aussehen:

struct Msg_Box
{
union
{
unsigned char status;
struct
{
unsigned int warning :1;
unsigned int error :1;
unsigned int test :1;
}Bits;
} Status;
}Msg1;

Der Pointer mit Zugriff in einer Funktion sieht momentan so aus:
struct Msg_Box *Message_ptr = &Msg1;
Message_ptr->Status.Bits.error = 1;

Der Zugriff auf die Struktur funktioniert aber nur aus dem Source File, in dem die Struktur includiert ist. Was muss ich machen, damit ich auch aus anderen Files zugreifen kann. (Mehrfach includiert löst fehler aus: Multiple defined ....)
Ist übrigens ein embedded -Compiler
Vielen Dank schon jetzt für die Antworten!
 
Zuletzt bearbeitet:
Schreib in deiner Header-Datei folgendes rein:
Code:
#ifndef MYHEADER_H
#define MYHEADER_H

struct blabla
{
 ....
}
#endif

Gruß Homer
 
Original geschrieben von Daniel Toplak
Schreib in deiner Header-Datei folgendes rein:
Code:
#ifndef MYHEADER_H
#define MYHEADER_H

struct blabla
{
 ....
}
#endif


Gruß Homer

Das sieht in deinem Post aber sehr knapp aus. ;)
(edit: Ah, hast es repariert!)

Das Problem mit Msg1 ist, das du es in der Headerdatei definierst (also Platz reservierst), anstatt nur den Typ und die Existenz einer Variablen mit diesem Namen zu deklarieren. Zusätzlich zu Daniels Vorschlägen solltest du die .h so abändern:

Code:
// Typ deklarieren 
struct Msg_Box
{
  // blabla
};
// Kann sein, dass typedef nötig, habe z.Zt. nur C++-Deklaration im Kopf
extern struct Msg_Box Msg1; // reine Deklaration der Variablen Msg1


Die Definiton von Msg1 kommt in eine deiner .c-Dateien rein:
Code:
struct Msg_Box Msg1; // Hier wird (einmal)  Platz reserviert;

Du kannst jetzt ohne Konflikte in jeder .c deine Headerdatei inkludieren und auf Msg1 zugreifen.
 
Hi,

zuerst möchte ich mich für die schnellen Antworten bedanken ...!
Ich dachte, wenn ich einen Header in einem .c File includiere, dann ersetzt der Präprozessor die Zeile #include .... mit dem inhalt des .h. Nachdem die #include-Zeile ausserhalb jeder Funktion steht, dachte ich, die Struktur ist somit public. (... Falsch gedacht ...)
Was bewirkt dann die in Abhängigkeit des #define erzeugte Struktur? Dank des Präprozessors bekommt der Compiler doch von den #ifndef, etc. gar nichts mit, oder? (Sorry, bin absoluter Anfänger ...)

Das mit dem typedef hab ich schon versucht, erzeugt immer Fehler: ... multiple defined ...

Nochmals vielen Dank im Voraus für die Antworten.
 
Jetzt funktioniert´s! Inzwischen hab´ ich auch (endlich) begriffen was das Problem war. Sobald in der Struktur vor dem letzten Semikolon ein Name auftaucht, wird der Struktur ein Name und Speicher zugewiesen. Wenn ich den Header mehrfach includiere, dann gibt es diesen Namen und Speicher n-fach. Wobei mich der Ausdruck
Code:
struct Msg_Box Status;
, den ich momentan einmal vor main stehen habe wundert, weil ich dachte, das Zuweisungen in ANSI-C nicht ausserhalb einer Funktion geschehen dürfen.

Vielen Dank für eure Hilfe!
 
, den ich momentan einmal vor main stehen habe wundert, weil ich dachte, das Zuweisungen in ANSI-C nicht ausserhalb einer Funktion geschehen dürfen
Das ist auch keine Zuweisung, sondern die Definition einer Variablen. Dadurch, dass sie ausserhalb eines Funktionsrumpfes erfolgt, ist die Variable global.
 
Zurück