struct prototyp



  • Hallo Leute

    Jetzt hab ich ein kleines Problem. Ich war mir sicher, das irgendwo schon mal gesehen zu habe. Hoffe ihr könnt mir auf die Sprünge helfen. Oder geht das doch nicht?

    Der Compiler motzt wenn ich in der main.h den Typ T oder tTable verwenden möchte.

    Weiss jemand wie das lösen könnte? Danke für die Hilfe.

    //main.cpp
    #include "table.h"
    
    static tTable delegTable;
    
    //table.h
    #pragma once
    #ifndef __TABLE_H__
    #define __TABLE_H__
    struct tTable;
    typedef tTable T;
    T NewTable(int X,int Y);
    #endif
    
    //table.cpp
    #include "table.h"
    struct tTable{
    	int x,y;
    };
    T NewTable(int X,int Y){
    	T tab;
    	tab.x=X;
    	tab.y=Y;
    	return tab;
    }
    
    Fehlermeldung:
    error C2079: 'delegTable' verwendet undefiniertes struct 'tTable'
    


  • Du kannst die Definition in den Header packen oder aus delegTable einen Pointer machen. Bei der Verwendung von NewTable hast du das gleiche Problem.

    Was hast du mit dieser Konstruktion vor?



  • Hallo manni

    Danke für die Antwort.

    Ich möchte einen neuen Typ erzeugen, der am Anfang ohne Werte sein soll. Auch habe ich erst nachher Zugriff auf x + y.

    Die Funktion NewTable wollte ich gar nicht zeigen. Aber vielleicht werde ich sie noch brauchen.

    Das mit dem Pointer habe ich soeben gemacht. Nur wie weise ich jetzt die Werte zu. Folgendes funktioniert bei mir nicht.

    static T *delegTable;
    delegTable->x=5
    


  • wachs schrieb:

    Ich möchte einen neuen Typ erzeugen, der am Anfang ohne Werte sein soll. Auch habe ich erst nachher Zugriff auf x + y.

    Typen haben nie einen Wert. Die Sätze ergeben keinen Sinn, ich verstehe nicht, was du willst.

    wachs schrieb:

    static T *delegTable;
    delegTable->x=5
    

    delegTable kannst du nur benutzen, indem du den Pointer an Funktionen übergibst, die die Strukturdefinition kennen. Und natürlich musst du auch irgendwie einen Speicherbbereich besorgen und gegebenenfalls wieder freigeben. Und nein, new/delete funktionieren natürlich auch nur dort, wo die Strukturdefinition bekannt ist, nicht jedoch in deiner main.cpp.



  • Danke Manni das mit dem Poibter war eine guete Idee. Funktioniert genau so wie ich es haben wollte.

    gruss wachs

    //main
    static T delegTable;
    T *p=&delegTable;
    *p=NewTable(5,2);	
    return 0;
    
    //table.h
    struct tTable; 
    typedef tTable *T;
    T NewTable(int X,int Y);
    
    //table.cpp
    #include "table.h" 
    struct tTable{ 
        int x,y; 
    }; 
    T NewTable(int X,int Y){ 
        static tTable tab;
        tab.x=X;tab.y=Y;
        T res=&tab;
        return res;
    }
    


  • Das sieht irgendwie nicht schön aus.
    Vielleicht wäre ja das Pimpl-Idiom geeignet.



  • wachs schrieb:

    //main
    static T delegTable;
    T *p=&delegTable;
    *p=NewTable(5,2);	
    return 0;
    

    T ist doch schon der Pointer. Jetzt hast du einen Pointer auf einen Pointer auf ein tTable struct. Nicht wirklich schlimm aber unnötig. Ist dir außerdem bekannt was static bewirkt oder packst du das einfach überall davor?



  • Hallo Manni, und hallo sepi

    Ja ich weiss was es mit static auf sich hat.
    Schlüsselwort static -> Speicherreservierung im statischen Speicher

    Habs angepasst. Das in der main brauchts eigentlich auch nicht, aber da ich bei mir aus einer inneren Klassenfunktion raushüpfe, brauche ich sie bei mir.

    das Pimpl-Idiom werd ich mir noch anschauen. Kenne ich so als Begriff nicht.

    //main.h
    static T delegTable;
    delegTable=NewTable(5,2);
    
    //table.cpp 
    #include "table.h"
    struct tTable{ 
        int x,y; 
    }; 
    T NewTable(int X,int Y){ 
        tTable tab; 
        tab.x=X;tab.y=Y;
        return &tab;
    }
    

    gruss wachs



  • wachs schrieb:

    Habs angepasst. Das in der main brauchts eigentlich auch nicht, aber da ich bei mir aus einer inneren Klassenfunktion raushüpfe, brauche ich sie bei mir.

    Dein Codebeispiel zeigts aber genau anders herum. Das static muss in die NewTable Funktion.



  • Hallo sebi

    Mhhhh .. wenn ich das so anschauen, müsste ich dir recht geben. Es funktioniert jedoch bei mir zweifelsohne, und das mit sehr komplexeren Strukturen.

    Hast du da vielleicht eine Begründung warum das bei mir funktioniert?

    Danke

    gruss wachs



  • Du benutzt Speicher, der dir nicht mehr "gehört". Das geht solange gut, bis er wieder regulär benutzt wird. "Funktioniert" ist also rein zufällig.



  • Danke Manni

    Es ist also wirklich so. Hab jetzt gerade noch was ausprobiert.

    Wenn ich die Routine mehrmals hintereinander (in einer Schleife) nutze, und eine Array befülle delegTable[x], so haben alle die gleichen Werte. Dies könnte man mit 'new-delete' in der Funktion NewTable() lösen.

    Da ich diese Funktion nur temporär nutze, ist es aber nicht so schlimm. Für meinen Gebrauch reicht vorläufig eine 'static'.

    Es ist mir auch hier viel mehr um mechanische Umsetzung gegangen, darum auch das einfache Beispiel.

    Ich danke für die Hilfe.

    gruss wachs


Log in to reply