Header-Datei, Funktionen + globale Variablen
-
Ok, erstmal vielen Dank für die Infos, das hat schon ziemlich geholfen :).
Ich muss jetzt also meine Header-Datei in die (namentlich) zugehörige .c-Datei einbinden und dann kann ich (ohne irgendwas doppelt zu haben und somit mein Programm aufzublähen) meine Funktionen in beliebiger Reihenfolge eintragen. Richtig?
Die Includes musste ich bisher auch ausschließlich in den .c-Dateien einfügen, die Frage bezog sich ja nur darauf, ob es Probleme bereitet, wenn ich sie in mehrere .c-Dateien einfügen muss.
Soweit ich dich verstanden habe, geht das aber in Ordnung.Was deinen Tipp zu den Variablen angeht: Ich soll jetzt also eine Header-Datei für die .c-Datei erstellen, in der die main-Funktion zu finden ist? Klingt ganz vernünftig, wobei ich mit dem "extern" noch nichts zu tun hatte.
Dass globale Variablen irgendwie zu vermeiden sind, ist mir auch schonmal untergekommen. Ich nutze sie auch nur sehr selten, allerdings müsste ich ohne ebendiese nahezu allen meinen Funktionen zusätzliche, identische Parameter übergeben oder mit deinem Vorschlag auf weniger globale Variablen ausweichen - für mich in diesem Fall definitiv zuviel Aufwand, nur um ein paar Formalismen nachzukommen.
Noch eine neue Frage:
Ich habe eine Struktur erstellt, die ich wegen ihrer Länge in eine eigene Header-Datei gepackt habe. Zusammen mit der Struktur werden gleich die später zu verwendenden Elemente erzeugt.
Dieser "Struktur"-Header wird nun in meine main.c eingebunden (einfach per #include) - wie binde ich sie korrekt in die weiteren .c-Dateien ein? Muss ich jetzt wie bei den globalen Variablen vorgehen? Ich möchte schließlich, dass die Struktur-Elemente für alle .c-Dateien die gleichen sind, damit stets am gleichen Datensatz gearbeitet wird.
-
nwp2 schrieb:
Es ist etwas umstritten, aber irgendwie schon schlechte Praxis Headerdateien in Headerdateien einzubinden.
Ach was, das ist doch manchmal bei Typendeklarationen gar nicht vermeidbar, das ist gängige Praxis.
-
Stiefel2000 schrieb:
Noch eine neue Frage:
Ich habe eine Struktur erstellt, die ich wegen ihrer Länge in eine eigene Header-Datei gepackt habe. Zusammen mit der Struktur werden gleich die später zu verwendenden Elemente erzeugt.
Dieser "Struktur"-Header wird nun in meine main.c eingebunden (einfach per #include) - wie binde ich sie korrekt in die weiteren .c-Dateien ein? Muss ich jetzt wie bei den globalen Variablen vorgehen? Ich möchte schließlich, dass die Struktur-Elemente für alle .c-Dateien die gleichen sind, damit stets am gleichen Datensatz gearbeitet wird.Du packst in den Header lediglich die Deklaration rein, also sowas z.B:
struct my_struct
{
// ...
};Überall dort, wo der Typ bzw. die Struktur bekannt sein muss, bindest
du deinen Header mit include ein. Das kann natürlich auch mal eine
andere Headerdatei sein die z.B. Funktionsprototypen enthält, die
Strukturparameter entgegen nehmen, etc.
Das Erzeugen der Strukturen passiert in den *.c Dateien - vorzugsweise
in deinem Modul, das für die Erzeugung der Strukturen zuständig ist.struct my_struct ms[N]={0};
struct my_struct* pms = malloc ( ...
-
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 :).