Moin, offensichtlich bin ich zu blöd ein
1 | 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
|
Forum: Mikrocontroller und Digitale Elektronik Struct globalisieren?Moin, offensichtlich bin ich zu blöd ein
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 Sieh dir nur dein File funktionen.c an
Jetzt lösen wir mal die #include auf, sprich wir machen genau das gleiche was auch der Präprozessor macht. Dann steht da:
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.c ******
Machen wir jetzt das gleiche Spielchen wieder und sehen uns an, was der Präprozessor auf funktionen.c macht, dann kommt da raus
E voila! Jetzt ist auch in Funktionen.c bekannt, wie eine struct Werte_t aussieht. 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 Ich dachte mit
würde ich dem Compiler sagen, dass die
woanders definiert ist grübel. Soll dann:
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 Ingo L. schrieb: > Ich dachte mit >
> > würde ich dem Compiler sagen, dass die
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!
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. Dazu kommt noch die Unsitte mittels
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!
Nur die Definition wie eine Struktur aussieht, kommt ins Header File. Die Definition der Variablen bleibt nach wie vor in main.c! Ok, danke. Sorry wenn ich jetzt nochmal äußerst dumm frage, ich will es nur endgültig verstanden haben: Wenn ich:
in meinen Header schreibe, wird nicht dieses Struct erzeugt, sondern nur wie es aussieht?! Mit dem
sage ich dem Compiler, dass das Struct woanders definiert ist?! Und wenn wenn ich dann in meiner main.c
schreibe wird erst HIER ein Struct mit den Membern var1, var2 angelegt!? Wenn ich das:
in einer anderen *.c schreibe, was passiert dann? Wird das Struct doppelt erzeugt? Offensichtich nicht, denn der Programmspeicher bleibt weiterhin 4Byte. Gruß Knut > Wenn ich: (...) > in meinen Header schreibe, wird nicht dieses Struct erzeugt, sondern nur > wie es aussieht?! Exakt. > Mit dem >
> sage ich dem Compiler, dass das Struct woanders definiert ist?! Genau. > Und wenn wenn ich dann in meiner main.c >
> schreibe wird erst HIER ein Struct mit den Membern var1, var2 > angelegt!? So isses. > Wenn ich das: >
> 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. 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.
|
|