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 type

    Die 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-Funktion

    Struct 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


  • Mod

    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).


  • Mod

    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


Anmelden zum Antworten