Wo Struct definieren?
-
Hi,
ich habe ein Programm, was aus 2 "Klassen" besteht. Nennen wir sie mal Hauptprogramm.c und Nebenprogramm.c.
Hauptprogramm.c ist im groben wie folgt aufgebaut :
#include <stdlib.h> #include <stdio.h> #include "Nebenprogramm.h" struct meinStruct a; int main() { mache_etwas_1(&a); mache_etwas_2(&a); meineFunktion(&a); return 0; } int meineFunktion(struct meinStruct *a){ mache_etwas_3(a); return 0; }
Nebenprogramm.c :
#include <stdlib.h> #include <stdio.h> int mache_etwas_1(struct meinStruct *a){ //Mache etwas return 0; } int mache_etwas_2(struct meinStruct *a){ //Mache etwas return 0; } int mache_etwas_3(struct meinStruct *a){ //Mache etwas return 0; }
Nebenprogramm.h :
#ifndef brett_h #define brett_h struct meinStruct { int Komponente1; int Komponente2; int Komponente3; }; int mache_etwas_1(struct meinStruct *a); int mache_etwas_2(struct meinStruct *a); int mache_etwas_3(struct meinStruct *a); #endif
Das Programm kompiliert nicht und gibt sehr oft die Fehlermeldung
error: dereferencing pointer to incomplete typeDie Klasse Hauptprogramm.c kompiliert ohne Warnungen.
Die Klasse Nebenprogramm.c hat einwandfrei funktioniert, als ich alle Funktionen in ein Testprogramm kopiert habe, dort das Struct global definiert habe, in der main-FunktionStruct meinStruct a;
deklariert habe und von dort aus auf die Funktionen zugegriffen habe.
So gab es aber an zig Stellen die oben genannte Fehlermeldung.
Ich nehme also an, dass das Struct an der falschen Stelle definiert ist.
Ich hoffe, ihr könnt mir helfen.
Gruß re342
-
Zeile 16, was hat die Adresse von a (des lokalen a in der Funktion!) für eine Bedeutung?
Dreh mal das Warnlevel deines Compilers hoch. Ich habe den Eindruck, dass du keine Warnungen bekommst, weil du sie schlichtweg nicht eingeschaltet hast.
-
Oh das hab ich schlichtweg falsch abgetippt. Habs jetzt im Code korrigiert. Es ist natürlich nicht die Adresse der lokalen Variable gemeint.
-
Warnungen habe ich außerdem eingeschaltet (gcc -Wall)
-
Nebenprogramm.c kennt die Struktur doch gar nicht, weil dort Nebenprogramm.h nicht inkludiert ist ...
-
Oh stimmt. Vielen Dank. Daran hat es gelegen.
-
Kleine Bemerkung am Rande noch: der GCC unterdrückt mal gerne Warnungen, selbst mit -Wall.
Meine sämtlichen Makefiles haben diese Parameterliste:-Wextra -Wall -Wimplicit -Wno-unused-parameter
Damit gewöhnt man sich dann relativ schnell, ordentlichen Code zu schreiben. Und einmal hat's mir sogar dabei geholen, einen Bug zu finden, bei dem der 64-Bit-Rückgabepointer einer Funktion auf 32-Bit heruntergebrochen wurde (Header war nicht eingebunden, der Compiler nahm an, dass der Rückgabewert
int
ist, und der Linker hat die Funktion dann noch gefunden).
-
re342 schrieb:
Oh das hab ich schlichtweg falsch abgetippt. Habs jetzt im Code korrigiert. Es ist natürlich nicht die Adresse der lokalen Variable gemeint.
Deswegen immer Copy&Paste! Es macht keine Sinn, dass wir unsere Zeit mit eventuellen Tippfehlern verschwenden.
http://www.c-plusplus.net/forum/304133