C++ struct global ???



  • Hallo Ihr lieben.

    Da ich ja inzwischen unter die C# Programmierer gegangen bin und leider eine Änderung in meinem alten C/C++ machen muss, stehe ich mal wieder gewaltig auf dem Schlauch und komme, trotz Suche nicht wirklich weiter.

    Also meine Dateistruktir im Projekt ist folgendermaßen:

    dec.h = Alle definitionen (#define) und auch hier werden die structs definiert
    def.h = Hier werden die Variablen erzeugt und diese Datei wird in der Haupt-cpp Datein includiert
    extern.h = hier werden alle globalen variablen mit "extern" bezeichnet und diese Datei wird auch in allen anderen cpp Dateien includiert.

    Das funktioniert bisher einwandfrei, meine globalen Variablen stehen mir immer und überall zur Verfügung.

    Seit letzte Woche allerdings habe ich ein (Verständnis-) Problem.

    Also ich definiere eine struct in dec.h:

    /*dec.h*/
    typedef struct{
    std:.string bla;
    int blubb;
    usw...
    }MEINSTRUCT
    

    Dann weiter in def.h:

    /*def.h*/
    ....
    MEINSTRUCT * meinstruct;
    ...
    

    Dann weiter in extern.h:

    /*extern.h*/
    ....
    extern MEINSTRUCT * meinstruct;
    ...
    

    Dann benutze ich die Structur in einer cpp Datei, in die extern.h includiert ist:

    /*fkt.cpp*/
    meinstruct= (MEINSTRUCT*)cm.rbuffer;
    

    Also das ist der Rückgabewert einer Funktion (struct als object), welche dann auf das struct umgebogen wird.
    Das funktioniert einwandfrei, ich kann auf alle Variablen zugreifen und es stehen die Werte korrekt drin.

    /*fkt.cpp*/
    meinstruct->bla;
    

    Jetzt bin ich der Meinung, daß meinstruct global ist und überall die Werte zur Verfügung stehen, was aber offensichtlich nicht so ist.

    Führe ich das Programm weiter aus, und löse eine andere Funktion in derselben cpp Datei aus, ist meinstruct leer, bzw. es steht Mist drin.

    /*fkt.cpp*/
    
    void function gibsmir()
    {
    ...
    meinstruct->bla; //->> schlechtes Pointer
    ...
    }
    

    Was mache ich falsch und wie kann ich das Problem lösen?

    Vielen herzlichen Dank schonmal!



  • Dein meinstruct ist kein struct, sondern ein Zeiger auf ein struct. Die Frage ist nun, auf was für ein struct zeigt er? Offenbar wird dieser globale Zeiger irgendwann mal auf cm.rbuffer gesetzt!? Was genau ist das und wo und wann genau passiert das?



  • meinstruct ist kein struct, sondern ein Pointer auf MEINSTRUCT, das stimmt und soweit ist meine Überlegung auch.
    Boah, das ist Studium 1. Semster ich erinnere mich schwach 😮

    Also benötige ich noch eine INSTANZ von MEINSTRUCT und lasse meinstruct auf diese Instanz zeigen:

    MEINSTRUCT foo;
    foo= (MEINSTRUCT)cm.rbuffer; //Fehler, Umwandlung geht nimmer
    
    meinstruct = &foo;
    

    Wenn ich dann foo global in def.h und extern.h setze müsste es doch gehen, oder?
    Wie sieht dann die Umwandlung aus?



  • Und wo ist dieses foo definiert? Und wann passiert die Zuweisung? Was genau ist das Problem mit der "Umwandlung"? Wofür genau ist eigentich dieses def.h, sollte das nicht eigentlich wenn dann ein def.c sein?



  • Also wenn ich in diesem Falle das foo global in extern.h und dec.h definiere, passiert die Zuweisung in einer Funktion zum Start des Programmes.



  • Naja, wenn foo eine globale Variable ist und deren Adresse an meinstruct zugewiesen wird, bevor diese Funktion gibsmir() aufgerufen wird, dann sollte alles in Ordnung sein...



  • Ok dann sollte das ja passen, jetzt stimmt die Umwandlung aber nicht mehr:

    foo= (MEINSTRUCT*)cm.rbuffer; //Fehler
    meinstruct = &foo;
    

    Fehler 53 error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'MEINSTRUCT *' akzeptiert (oder keine geeignete Konvertierung möglich)

    Lasse ich das Sternchen weg, sagt er mir, daß das BYTE[..] nicht in ein MEINSTRUCT konvertiertwerden kann.



  • Dem entnehme ich, dass cm.rbuffer ein BYTE Array ist? Da oben castest du nun einen Pointer auf das erste Element in diesem Array in einen Pointer auf MEINSTRUCT und versucht dann, diesen Pointer auf ein MEINSTRUCT an ein MEINSTRUCT zuzuweisen. Wenn dir nicht klar ist, dass das nicht funktionieren kann, würde ich dir wirklich sehr sehr empfehlen, nochmal aufmerksam ein gutes Grundlagenbuch zu lesen (und dir davor mal klarzumachen, in was für einer Sprache du jetzt eigentlich genau programmieren willst, denn das sieht mir hier eher aus, als ob du eigentlich C programmieren willst und nicht C++ und ganz bestimmt nicht C++/CLI).

    Hint: Die Lösung erfodert einen * mehr und nicht einen * weniger...



  • Doch, das ist mir klar:
    memcpy(&foo,&cm.rbuffer,sizeof(MEINSTRUCT));

    Vielen Dank für die extrem schnelle Hilfe und den Denkanstoß,man verlernt es halt ziemlich schnell wie es aussieht... 👍



  • gut, memcpy() ist auch eine Lösung...^^

    EDIT: Allerdings hast du da oben streng genommen wohl ein & zuviel, nur hast du das Glück, dass cm.rbuffer eine lokale Variable ist und das zusätzliche & zufällig auch den richtigen Wert liefert. Es müsste entweder &cm.rbuffer[0] oder einfach nur cm.rbuffer heißen, denn du willst die Adresse des ersten Elements und nicht die Adresse des ganzen Arrays... 😉



  • Du hast natürlich recht...danke für den Interessanten Nachtrag 👍


Anmelden zum Antworten