Hallo zusammen!
Ich habe hier grad ein Problem.
Ich habe eine Funktion in einer ausgelagerten .c-Datei. Die .h ist
eingebunden. In dieser ausgelagerten .c-Datei möchte ich auf eine
globale Variable in der main.c zugreifen, aber das klappt bis dato
nicht. Was muss ich machen?
Irgendwo muss sicher ein extern oder ähnliches hin. Oder welche
Möglichkeit gibt es noch?
Wenn der Compiler nicht weiss wie die struct aufgebaut ist kann er auch
keine Zugriffe auf Elemente davon übersetzen. Den Aufbau der struct hast
du aber nur in der main.c dem Compiler beschrieben und nicht in der
andere_datei.c.
Namehiereingeben schrieb:> Wenn der Compiler nicht weiss wie die struct aufgebaut ist kann er auch> keine Zugriffe auf Elemente davon übersetzen. Den Aufbau der struct hast> du aber nur in der main.c dem Compiler beschrieben und nicht in der> andere_datei.c.
Also was muss ich noch machen?
Frank schrieb:> Global in der main, nicht in meiner Zusatzfunktion.
Ich hatte da Probleme beim Verständnis der Sichtbarkeit der Variablen...
;-)
Es reicht aus, wenn diese Deklaration hier
1
structcontrol
2
{
3
uint16_tmenu_item;
4
uint16_tsecond_item;
5
:
6
};
in den andere_datei.h Header kommt, damit der Inhalt des Structs in der
Funktion bekannt ist.
Lothar Miller schrieb:> in den andere_datei.h Header kommt, damit der Inhant des Structs in der> Funktion bekannt ist.
OK, ich habe jetzt gerade folgendes gemacht:
Ich habe das struct also nochmal in die andere .c-Datei gepackt -
scheint auch erstmal zu gehen? Wo ist jetzt der Unterschied es in die
.h- oder .c-Datei zu packen?
Dann mach dir eine...
Wenn du den Prototypen in der main.h machen würdest, dass eigentlich
Struct in der main.c dann deklarierst, kannst du in anderen Files auf
das Struct zugreifen, wenn du dort die main.h includierst. Vorher musst
du natürlich noch in der main.h dein in der main.c deklariertes Struct
als extern deklarieren.
Dann klappts auch mit den Nachbarfiles...
Knut
Detlev T. schrieb:> Ist das nicht nur ein Syntax-Fehler, weil das struct control einfach nie> geschlossen wird (Klammer fehlt)?
Nee, das war ein Kopierfehler ;-)
> OK, kann mir denn noch einer sagen, wo der Unterschied ist, ob ich> // andere_funktion.h ...> oder> // andere_funktion.c ...> mache?
Vermutlich steht in andere_datei.c auch das hier:
#include andere_datei.h
Und damit wäre der Struct sowohl in main.c wie auch in andere_date.c
bekannt. Überall eben, wo er verwendet wird. Und darauf kommt es an.
Frank schrieb:> OK, kann mir denn noch einer sagen, wo der Unterschied ist, ob ich
Stell dir einfach mal vor du machst das hier
main.c
1
structcontrol
2
{
3
uint8_tabc;
4
uint16tdef;
5
};
6
7
structcontrolglobvar;
8
9
intmain()
10
{
11
globvar.abc=8;
12
globvar.def=16;
13
14
foo();
15
}
andere.c
1
structcontrol
2
{
3
doubleabc;
4
uint16tdef;
5
};
6
7
externstructcontrolglobvar;
8
9
voidfoo()
10
{
11
globvar.abc=42.0
12
}
Grundsätzlich ist das von der Vorgehensweise her richtig. Jedes C-File
ist in sich vollständig und hat alles was es braucht.
Aber: Die Strukturdefinitionen in den beiden C-Files stimmen NICHT
überein. Das kann zb passieren, wenn man eine Strukturdefinition im
Nachhinein noch erweitert oder umbaut.
Der Compiler kann dich davor nicht schützen! Der sieht sich immer nur 1
C-File an. Was im anderen drinnen ist, interessiert ihn nicht.
Das wäre aber ein schwerer Fehler, wenn die Strukturaufbauten nicht
übereinstimmen!
So rum
irgendwas.h
1
structcontrol
2
{
3
doubleabc;
4
uint16tdef;
5
};
6
7
externstructcontrolglobvar;
main.c
1
#include"irgendwas.h"
2
3
structcontrolglobvar;
4
5
intmain()
6
{
7
globvar.abc=8;
8
globvar.def=16;
9
10
foo();
11
}
andere.c
1
#include"irgendwas.h"
2
3
voidfoo()
4
{
5
globvar.abc=42.0
6
}
kann dir dieser Fehler aber nicht passieren.
Dadurch, dass die eigentliche Strukturdefinition nur an EINER Stelle
steht und überall wo sie gebraucht wird inkludiert wird, vermeidest du
ganz einfach diesen Fehler.
Hier ist das verschieben in ein Header File also Selbstschutz um dich
selbst vor Fehlern zu schützen.
Frank schrieb:> OK, kann mir denn noch einer sagen, wo der Unterschied ist, ob ich//
andere_funktion.h
(...)
> oder// andere_funktion.c
(...)
> mache?
Sofern du die andere_funktion.h in die andere_funktion.c mittels
#include eingebunden hast ist da zunächst kein Unterschied - die
#include-Anweisung sorgt im Compiler lediglich dafür, dass der Inhalt
der angegebenen Datei an der Stelle des #include 1:1 eingelesen wird als
ob man ihn direkt hingeschrieben hätte. Die struct in der .h zu
definieren hat allerdings den Vorteil, dass man die .h-Datei noch in
andere Dateien includen kann (z.B. in der main.c) und dort dann
ebenfalls eine Definition dieser struct hat, ohne den Text der die
struct beschreibt selbst in mehrere Dateien reinschreiben zu müssen.
Neben einem Hauch von Arbeitserleichterung verringert das auch die
Wahrscheinlichkeit eines Fehlers: Da nur an einer Stelle Änderungen
vorgenommen werden müssen um automatisch alle Verwendungen zu ändern
besteht nicht das Risiko, dass man die Änderung in irgendeiner .c-Datei
vergisst.