www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Struct globalisieren?


Autor: I. L. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

offensichtlich bin ich zu blöd ein
 struct 
zu globalisieren? Was mache ich denn da falsch?


Bekomme immer die Fehlermeldung:
../Funktionen.c:15: error: invalid use of undefined type 'struct 
Werte_t'

Ich hab das Ding doch definiert!

Gruß Knut

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

Bewertung
0 lesenswert
nicht lesenswert
Sieh dir nur dein File funktionen.c an
// Funktionen.c

#include "main.h"
#include "Funktionen.h"



void XYZ (void);


void xyz (void)
{
  Werte.Var1 = 10;

}

Jetzt lösen wir mal die #include auf, sprich wir machen genau das 
gleiche was auch der Präprozessor macht.
Dann steht da:

// main.h



#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>





extern volatile struct Werte_t Werte;


// Funtkionen.h

extern void XYZ (void);



void XYZ (void);


void xyz (void)
{
  Werte.Var1 = 10;

}

und das wird jetzt compiliert. Siehst du da irgendwo eine Definition wie 
denn nun ein struct Werte_t aussieht? Also ich nicht.


*.c Files werden unabhängig voneinander compiliert!
Das du in main.c die Defintion dieser struct hast, ist zwar nett, 
interessiert aber den Cmopiler nicht, wenn er funktionen.c compiliert.

Zieh die Struktur in ein Header File, so dass alle *.c Files, die die 
Struktur benötigen sie zur Verfügung haben.

main.h
******
// main.h

#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>

struct Werte_t
{
  uint16_t var1;
  uint16_t var2;
};

extern volatile struct Werte_t Werte;

main.c
******
#include "main.h"


volatile struct Werte_t Werte;

int main (void)
{
  while(1);
  return (0);
}


Machen wir jetzt das gleiche Spielchen wieder und sehen uns an, was der 
Präprozessor auf funktionen.c macht, dann kommt da raus
// main.h

#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>

struct Werte_t
{
  uint16_t var1;
  uint16_t var2;
};

extern volatile struct Werte_t Werte;

// Funtkionen.h

extern void XYZ (void);



void XYZ (void);


void xyz (void)
{
  Werte.Var1 = 10;

}

E voila!
Jetzt ist auch in Funktionen.c bekannt, wie eine struct Werte_t 
aussieht.

Autor: klops (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Compiler muss Deine Def natürlich auch sehen.
Die ist aber nur im main.c sichtbar,
nicht in Funktionen.c
Abhilfe: Nach main.h verschieben

Autor: I. L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich dachte mit
extern volatile struct Werte_t Werte;

würde ich dem Compiler sagen, dass die
 struct 
 woanders definiert ist grübel.


Soll dann:
volatile struct Werte_t
{
  uint16_t var1;
  uint16_t var2;

} Werte;

in die main.h? Dann lege ich doch aber in jedem *.c -File wo ich die 
Main.h includiere ein struct an, oder nicht?



Gruß Knut

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

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:
> Ich dachte mit
>
> extern volatile struct Werte_t Werte;
> 
>
> würde ich dem Compiler sagen, dass die
 struct 
 woanders
> definiert ist grübel.

Und wie soll der Compiler die finden?
Damit er mittels

  Werte.Var1 = 10;

darauf zugreifen kann, muss er wissen wie die Struktur aussieht! Nur 
woher weiß er denn das, wenn du es ihm nicht mitteilst.
Der COmpiler durchsucht nicht eigenständig alle deine *.c Files auf der 
Platte auf der Suche nach einer entsprechenden Strukturbeschreibung!

Er hat einen Eingangstext und das ist das *.c File, welches du ihm 
gibst.
Da (nachdem alle #include aufgelöst sind) muss alles enthalten sein!

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

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:

> in die main.h?

Siehe
Beitrag "Re: Struct globalisieren?"

(Ich hab noch ergänzt)

> Dann lege ich doch aber in jedem *.c -File wo ich die
> Main.h includiere ein struct an, oder nicht?

Macht doch nichts

1) stimmen alle Strukturbeschreibungen derselben Struktur in einem
   Programm auf die Art automatisch überein

2) Ist das ja nur die Blaupause. Quasi der Plan wie eine derartige
   Variable aussehen würde, wenn man eine anlegen würde.
   Deswegen wird dein Programm ja nicht größer.

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

Bewertung
0 lesenswert
nicht lesenswert
Dazu kommt noch die Unsitte mittels
volatile struct Werte_t
{
  uint16_t var1;
  uint16_t var2;

} Werte;

gleichzeitig
* zu definieren wie eine Struktur aussieht
* und auch noch in einem Aufwasch eine entsprechende Variable
  davon zu definieren

Nimm Abstand davon, wenn dich das verwirrt und trenne die Dinge!
struct Werte_t
{
  uint16_t var1;
  uint16_t var2;

};

volatile struct Werte_t Werte;

Nur die Definition wie eine Struktur aussieht, kommt ins Header File.
Die Definition der Variablen bleibt nach wie vor in main.c!

Autor: I. L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke. Sorry wenn ich jetzt nochmal äußerst dumm frage, ich will es 
nur endgültig verstanden haben:


Wenn ich:
struct Werte_t
{
  uint16_t var1;
  uint16_t var2;
};

extern volatile struct Werte_t Werte;
in meinen Header schreibe, wird nicht dieses Struct erzeugt, sondern nur 
wie es aussieht?!

Mit dem
extern volatile struct Werte_t Werte;
sage ich dem Compiler, dass das Struct woanders definiert ist?!

Und wenn wenn ich dann in meiner main.c
volatile struct Werte_t Werte;
schreibe wird erst HIER ein Struct mit den Membern var1, var2 
angelegt!?

Wenn ich das:
volatile struct Werte_t Werte;
in einer anderen *.c schreibe, was passiert dann? Wird das Struct 
doppelt erzeugt? Offensichtich nicht, denn der Programmspeicher bleibt 
weiterhin 4Byte.


Gruß Knut

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

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich:
(...)
> in meinen Header schreibe, wird nicht dieses Struct erzeugt, sondern nur
> wie es aussieht?!

Exakt.

> Mit dem
>
> extern volatile struct Werte_t Werte;
> 
> sage ich dem Compiler, dass das Struct woanders definiert ist?!

Genau.

> Und wenn wenn ich dann in meiner main.c
>
> volatile struct Werte_t Werte;
> 
> schreibe wird erst HIER ein Struct mit den Membern var1, var2
> angelegt!?

So isses.

> Wenn ich das:
>
> volatile struct Werte_t Werte;
> 
> in einer anderen *.c schreibe, was passiert dann? Wird das Struct
> doppelt erzeugt?

Ja.

> Offensichtich nicht, denn der Programmspeicher bleibt
> weiterhin 4Byte.

Es gibt ärgerlicherweise eine Konfigurationsoption des gcc, 
solchermaßen identisch definierte Variablen zusammenzulegen.

Damit wird dieser Programmierfehler verborgen, andere Compiler 
(genauer: Linker) geben da eine Fehlermeldung aus.

Autor: I. L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, vielen dank. Ich habs begriffen!!!

Schönen Abend noch



Gruß Knut

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.