Forum: Mikrocontroller und Digitale Elektronik Struct erzeugen, das in mehreren Dateien verwendet weren kann


von Steven (Gast)


Lesenswert?

Hallo Leute!

Ich habe ein Problem bei meiner uC-Programmierung.

Ich habe mehrere Dateien, ein struct, welches alle Daten für mein 
Schieberegister beeinhaltet, soll bei den Funktionen für das SR sitzen. 
Die Daten in diesem struct muss ich von außen änndern können, also muss 
das struct auch in anderen Dateien verfügbar sein.

Wie und wo platziere ich jetzt das struct?

Mein Aufbau:
1
void main( void )
2
{
3
  #include "sr_functions.h"
4
5
  ...
6
7
  schieberegister_daten.anzeigestelle = 2;
8
  ...
9
}

sr_functions.h :
1
struct sr
2
{
3
  ...
4
  uint8_t anzeigestelle;
5
} schieberegister_daten;
6
7
...

sr_functions.c :
1
extern struct schieberegister_daten;
2
3
...

Wo initialisiere ich das struct? In der .h? Oder kommt das struct in die 
.c und der Verweis in die .h?

Klar ist es nicht die schöne Art, eine quasi "globale"-Variable 
anzulegen, aber ich habe extremen Speichermangel und Funktionen, die 
jetzt einzelne Variablen ändern, verbrauchen wieder Code...:\

Kann mir da einer helfen?

von Oliver (Gast)


Lesenswert?

Deklaration des structs in sr_functions.h
extern struct schieberegister_daten; in sr-functions.h

#include "sr-functions.h" kommt in allen .c-Dateien, die die Variable 
verwenden.

"struct schieberegister_daten;" in sr_functions.c

Initialisierung in sr_functions.c (oder auch jeder anderen .c-Datei, 
falls sinnvoll, du kannst ja schliesslich von überall drauf zugreifen).

Oliver

von Steven (Gast)


Lesenswert?

Oliver schrieb:
> "struct schieberegister_daten;" in sr_functions.c

OK, danke!

Also:

sr_functions.h :
1
struct sr
2
{
3
  ...
4
  uint8_t anzeigestelle;
5
};
6
7
extern struct schieberegister_daten;

sr_functions.c
1
struct sr schieberegister_daten = { ... };

Wo liegt denn jetzt der Unterschied, wenn ich direkt in der 
sr_functions_h das struct ablege? Wenn ich diese .h dann einbinde, habe 
ich doch auch immer das struct, oder nicht? Oder habe ich dann immer 
eine neue Kopie von dem struct in jeder Datei?

Also quasi so:

sr_functions.h :
1
struct sr
2
{
3
  ...
4
  uint8_t anzeigestelle;
5
} schieberegister_daten = { ... };

Und dann diese .h überall includieren.

von Steven (Gast)


Lesenswert?

Steven schrieb:
> sr_functions.h :
> struct sr
> {
>   ...
>   uint8_t anzeigestelle;
> };
>
> extern struct schieberegister_daten;

OK, das geht auch nicht - hier muss ich auch noch
1
extern struct sr schieberegister_daten;
schreiben. Ist das dann richtig so?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Steven schrieb:
> Wo liegt denn jetzt der Unterschied, wenn ich direkt in der
> sr_functions_h das struct ablege? Wenn ich diese .h dann einbinde, habe
> ich doch auch immer das struct, oder nicht? Oder habe ich dann immer
> eine neue Kopie von dem struct in jeder Datei?

Lies Dir mal in Deinem C-Buch die Bedeutung des Schlüsselwortes extern 
durch.

von Steven (Gast)


Lesenswert?

Ich hab kein C-Buch, kannst du es mir nicht verraten?

von Peter D. (peda)


Lesenswert?

Die Definition einer Variablen ist eine Deklaration, bei der 
Speicherplatz zugeordnet wird.

D.h. im h-File wird die struct deklariert und dieses wird von allen 
eingebunden, die darauf zugreifen.
Zusätzlich wird eine Variable mit dem Typ der struct als extern 
deklariert.
Speicherplatz wird damit nicht belegt.

Und nur in einem c-File wird dann die Variable definiert.
Dabei kann sie dann auch vorbelegt (initialisiert) werden.


Peter

von Cyblord -. (cyblord)


Lesenswert?

Steven schrieb:
> Ich hab kein C-Buch, kannst du es mir nicht verraten?

http://openbook.galileocomputing.de/c_von_a_bis_z/

Jetzt hast du eins ;-)

von Oliver (Gast)


Lesenswert?

Steven schrieb:
> OK, das geht auch nicht - hier muss ich auch nochextern struct sr 
schieberegister_daten;
> schreiben. Ist das dann richtig so?

Nicht auch noch, sondern nur. Damit geht es.

Oliver

von Dosmo (Gast)


Lesenswert?

Steven schrieb:
> Oliver schrieb:
> Wo liegt denn jetzt der Unterschied, wenn ich direkt in
> dersr_functions_h das struct ablege? Wenn ich diese .h dann einbinde,
> habeich doch auch immer das struct, oder nicht? Oder habe ich dann
> immereine neue Kopie von dem struct in jeder Datei?

Falls Du Code in eine Header-Datei (.h) schreibst, wird dieser Code in 
jedes Modul (.c) eingefügt, das den Header einbindet.
Wenn Du also
1
int a = 1;
in einen Header schreibst, wird jedes Modul eine eigene Variable "a" 
anlegen und mit 1 initialisieren.
D.h. Du hättest dann mehrere Variable namens "a". Wenn Du nun versuchst, 
diese Variable extern (d.h. außerhalb eines Moduls) sichtbar zu machen, 
wird der C-Compiler meckern, daß er nicht weiß, welche Variable Du 
meinst, weil es ja mehrere mit dem gleichen Namen gibt.

Globale Variablen gehen so:
Es gibt einen "Besitzer", d.h. ein Modul, in dem die Variable angelegt 
wird, d.h. Speicherplatz dafür belegt.
Außerdem gibt es "Benutzer", d.h. Module, die auf diese Variable 
zugreifen können.
Normalerweise macht der Besitzer die Variable über seinen Header 
bekannt, d.h. wenn Du eine globale Variable in "doof.c" anlegst, steht 
in "doof.h" dann die externe Referenz ("extern int a;") drinn.

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.