Header-Datei, Funktionen + globale Variablen
-
Sorry, entweder durchblicke ich das nicht ganz, oder es hilft mir nicht.
Ich benötige ein Array von Struktur-Elementen, da ich mit einer for-Schleife an jedem Element arbeiten will. Wenn ich das so dynamisch machen wollte, wie du es vorschlägst, müsste ich vermutlich ein realloc anwenden, aber ich bin nicht sicher, ob das bei der Größe, die eine Struktur haben kann, noch empfehlenswert ist. Außerdem ist im Voraus einigermaßen sicher, wieviele Elemente ich brauche.
Wenn ich den Header mit der Struktur irgendwo einbinde, muss ich dann #ifndef etc. verwenden, oder soll ich ihn blind eintragen?
Mal folgendes Beispiel:
struct Struktur { ... }Struktur_Elemente[500];
So steht's im Header (und aus obigen Gründen würde ich es auch gern so lassen, wenn möglich). Werden jetzt bei jedem Einbinden des Headers 500 neue Elemente erzeugt, oder handelt es sich stets um die selben, sodass hier gar kein Problem vorliegt?
-
Stiefel2000 schrieb:
Mal folgendes Beispiel:
struct Struktur { ... }Struktur_Elemente[500];
So sollte man es nicht machen, es kann Probleme aufgrund Mehrfacheinbindung geben. Die Definition (das ist die Erzeugung der Struktur) muss aus dem Header raus, die Deklaration kommt rein:
///////////////////////////////////////////////////////////////// // my_struct.h #ifndef MY_STRUCT_H #define MY_STRUCT_H struct my_struct { // ... }; extern my_struct ms[500]; // Deklaration. #endif // MY_STRUCT_H ///////////////////////////////////////////////////////////////// // my_struct.c #include "my_struct.h" my_struct ms[500] = {0}; // Definition und Initialisierung.
-
Big Brother schrieb:
my_struct ms[500] = {0}; // Definition und Initialisierung.
du meinst wohl: struct my_struct ms[500]=..., das ist ja kein typedef.
-
;fricky schrieb:
Big Brother schrieb:
my_struct ms[500] = {0}; // Definition und Initialisierung.
du meinst wohl: struct my_struct ms[500]=..., das ist ja kein typedef.
Stimmt, wo hat sich das doofe Wort bloß versteckt?
-
Habe das so versucht, bekomme nun beim Kompilieren folgende Fehlermeldungen:
//my_struct.h struct my_struct { // ... }; extern my_struct ms[500];
//my_struct.c #include "my_struct.h" struct my_struct ms[500];
..\my_struct.h:85: error: syntax error before "ms" ..\my_struct.h:85: warning: type defaults to `int' in declaration of `ms' ..\my_struct.h:85: warning: data definition has no type or storage class
Was soll eigentlich das "= {0};" bringen?
Noch eine Frage:
Kann ich ein#define ZAHL 7268
irgendwo so unterbringen, dass ich es nicht in jeder .c-Datei unterbringen muss? Damit verlöre die Zeile nämlich ihren Sinn.
-
Stiefel2000 schrieb:
..\my_struct.h:85: error: syntax error before "ms" ..\my_struct.h:85: warning: type defaults to `int' in declaration of `ms' ..\my_struct.h:85: warning: data definition has no type or storage class
da muss auch noch ein 'struct' hin.
Stiefel2000 schrieb:
Was soll eigentlich das "= {0};" bringen?
in diesem fall ... nichts.
-
;fricky schrieb:
Stiefel2000 schrieb:
Was soll eigentlich das "= {0};" bringen?
in diesem fall ... nichts.
Das initialisiert alle Elemente mit 0. In diesem Fall würde es der Compiler automatisch für dich tun, so wie er es für alle globale Variable tut, was ich gern vergesse
-
Ok, dann so:
//my_struct.h struct my_struct { // ... }; extern struct my_struct ms[500];
//my_struct.c #include "my_struct.h" struct my_struct ms[500];
Diesmal folgende Fehlermeldung:
my_struct.h:86: error: variable-size type declared outside of any function
Auch meine weitere Frage hänge ich nochmal an:
Kann ich ein#define ZAHL 7268
irgendwo so unterbringen, dass ich es nicht in jeder .c-Datei unterbringen muss? Eine Variable geht hier (glaub' ich) nicht, da ich damit ein statisches Array erstellen will.
-
Stiefel2000 schrieb:
Diesmal folgende Fehlermeldung:
my_struct.h:86: error: variable-size type declared outside of any function
Zeig doch die Datei, oder kommentiere alles aus und füge schrittweise ein, bis du den Fehler eingegrenzt hast.
Stiefel2000 schrieb:
Auch meine weitere Frage hänge ich nochmal an:
Kann ich ein#define ZAHL 7268
irgendwo so unterbringen, dass ich es nicht in jeder .c-Datei unterbringen muss? Eine Variable geht hier (glaub' ich) nicht, da ich damit ein statisches Array erstellen will.
Das define kannst du auch in einen Header packen. Ein statisches Array bekommst du auch mit einem enum hin:
enum {my_size = 100}; char array[my_size];
-
Also die angegebene Zeile 86 ist genau die, die
extern struct my_struct ms[500];
enthält.
Ich verstehe ja durchaus die Fehlermeldung, nur leider kann ich mir keinen Reim darauf machen.
EDIT: Habe den Fehler jetzt beseitigen können (in der my_struct.c stand noch eine Variable in den eckigen Klammern), jetzt kompiliert das Programm wieder. Mal schauen, ob es noch so läuft, wie geplant.
Erstmal vielen Dank für eure Hilfe, vielleicht kann ich ja ab jetzt Header-Dateien sinnvoller einsetzen :).