mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Struct als extern deklarieren


Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Der extern Befehl ist mir normalerweise bekannt. Aber mit einem struct 
scheint es per gcc(WINAVR) nicht zu funktionieren?!?

Habt ihr Erfahrungen?

main.c:
volatile struct bit
{
  unsigned trigger:1;
  unsigned state_1:1;
  unsigned state_2:1;
  unsigned open_signal:1;
  unsigned http:1;
}flag;


externes modul:

extern volatile bit flag;

so funktioniert es nicht. Ich weiß hier nicht, was ich falsch mache. 
Eigentlich hatte das Strukt den Namen "bit" nicht. Diesen habe ich 
vergeben, damit ich weiß, was ich als extern deklarieren muss.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:

> externes modul:
>
> extern volatile bit flag;
>
> so funktioniert es nicht. Ich weiß hier nicht, was ich falsch mache.

Wenn du Compiler wärst und du nur dieses hier zur Verfügung hast

modul.c
*******
extern volatile bit flag;

woher weißt du, wie die Struktur aussieht, welche Member sie hat und wie 
diese Member angeordnet sind?


Jedes C-File wird für sich alleine compiliert, ohne Ansehen von anderen 
*.c File.
Wenn du daher die Struktur in einem anderem C File hast, dann ist das 
nett, hilft aber dem Modul.c nichts. Denn das hat diese 
Strukturdefinition nicht zur Verfügung.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
extern volatile struct bit flag;

und wie KHB bereits sagte: die Struct muß dort dann auch bekannt sein.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Willst du mir jetzt sagen, dass ich das struct in dem ext. modul neu 
aufführen muss, oder willst du mir sagen, dass es nicht möglich ist?

Danke schon mal für deine Antwort!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier passieren zwei Dinge gleichzeitig:
volatile struct bit
{
  unsigned trigger:1;
  unsigned state_1:1;
  unsigned state_2:1;
  unsigned open_signal:1;
  unsigned http:1;
}flag;

Einerseits wird ein Strukturtyp deklariert (struct bit), andererseits 
wird eine Variable dieses Typs definiert.

Um diese Variable aus anderen Modulen heraus verwenden zu können, muss 
in anderen Modulen der Strukturtyp bekannt sein.

Daher sollten die beiden Dinge voneinander getrennt werden:
struct bit
{
  unsigned trigger:1;
  unsigned state_1:1;
  unsigned state_2:1;
  unsigned open_signal:1;
  unsigned http:1;
};

volatile struct bit flag;

Als nächster Schritt kann jetzt die Deklaration des Strukturtyps in eine 
Headerdatei ausgelagert werden, damit sie anderen Modulen bekanntgemacht 
werden kann.

In der Headerdatei steht dann folgendes:
struct bit
{
  unsigned trigger:1;
  unsigned state_1:1;
  unsigned state_2:1;
  unsigned open_signal:1;
  unsigned http:1;
};

extern volatile struct bit flag;


und im C-Sourcefile, in dem die Variable "flag" definiert wird, steht 
nur noch
volatile struct bit flag;

(und natürlich vorher die #include-Anweisung für die Headerdatei)

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läuft jetzt!

Ist also doch problemlos möglich, auch structs als extern zu 
deklarieren.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Idee mit dem Auslagern in die Headerfile scheint mir sehr sinvoll, 
wenn ich sowieso schon modularisiere.

Frage am Rande:

wenn ich eine main.h habe, die ich von mehreren modulen aus einbinde, 
wie kann ich verhindern, dass defines oder includes mehrfach ausgeführt 
werden?

ein
#ifdef main.h
....
#endif

funzt nicht

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst den Struct in einem Header-File definieren (als typedef) und 
dieses Header-File überall includen, wo Du diesen Struckt verwenden 
willst.

Die Structvariable kann dann in irgend einem C-File global deklariert 
werden und mittels extern in den anderen C-Files importiert werden

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter:

Ja, das habe ich gerade umgesetzt. Es ist auch in meine main.h 
gewandert.

Aber diese main.h includiere ich von vielen modulen aus. Evtl. ist es 
hilfreich, Vorkehrungen zu treffen, dass die includes und defines aus 
der main.h nicht mehrfach durchgeführt werden.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> wenn ich eine main.h habe, die ich von mehreren modulen aus einbinde,
> wie kann ich verhindern, dass defines oder includes mehrfach ausgeführt
> werden?

Sofern Du in der Headerdatei nur Dinge deklarierst, sie aber nicht 
definierst, wird da nichts "mehrfach ausgeführt".

Oder bindest Du Deine mehreren Module selbst etwa auch mit #include ein?

Autor: !Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> wenn ich eine main.h habe, die ich von mehreren modulen aus einbinde,
> wie kann ich verhindern, dass defines oder includes mehrfach ausgeführt
> werden?
>
> ein
> #ifdef main.h
> ....
> #endif
>
> funzt nicht
#ifndef __main_h__ //man beachte das 'n'!
#define __main_h__
//Code
#endif

Manchmal steht noch ein Wert hinter dem #define, vermutl. ich das in 
bestimmten Fällen (welchen?) nötig um einen Fehler bei der 
"Präprocessierung" zu vermeiden.

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#ifndef MAIN_H
#define MAIN_H
...
#endif

Autor: Johnny B. (johnnyb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist auch hilfreich, wenn Du aus dem Struct gleich einen Datentyp 
machst.
Also irgendwie so:

typedef struct
{
  unsigned trigger:1;
  unsigned state_1:1;
  unsigned state_2:1;
  unsigned open_signal:1;
  unsigned http:1;
} bit_type;

Dann kannst Du ganz normal mit dem Ding hantieren wie mit anderen Typen.

Vorwärtsdeklaraton in H Datei:
extern volatile bit_type flags;

Typ deklarieren in C Datei:
volatile bit_type flags;

Verwendung in C Datei:
flags.trigger = 1;

Sollte in etwa so funktionieren, aber habe es nicht getestet.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
!Gast schrieb:
> Manchmal steht noch ein Wert hinter dem #define, vermutl. ich das in
> bestimmten Fällen (welchen?) nötig um einen Fehler bei der
> "Präprocessierung" zu vermeiden.

seit Jahrzehnten überflüssig.

Autor: !Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Klaus Wachtler
Danke für die Info!

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.