Zeiger auf Struct???



  • Hallo

    Ich muß einer unbekannten Funktion einen Zeiger auf ne Struct übergeben.
    Die Struct im Headerfile der DLL sieht so aus:

    typedef struct structtest
     {
      char Text[21];
      float Wert1;
      float Wert2;
     } STRUCTTEST;
    
    DLL_EXPORT int TestFunktion(char *Test); //Funktionsdefinition
    

    In meiner Funktion reserviere ich einen Speicher und will dann der "TestFunktion" einen Zeiger auf meine Struct übergeben damit diese dann wiederum die Struct befüllen oder auslesen kann.

    void Zeigeruebergabe(void)
    {
    structtest Test[500]; 
    memset(Test, 0 , sizeof(structtest) * 500);
    
    TestFunktion(???);
    }
    

    ~
    Gruß
    Lounsome~



  • Frag dazu am besten die Dokumentation der Library - für mich sieht es auf jeden Fall seltsam aus, das eine Funktion zum Füllen einer struct einen char* erwarten sollte.



  • DLL_EXPORT int TestFunktion(structtest *Test);
    

    Dann einfach deiner TestFunktion einen Zeiger auf ein Struct übergeben!



  • Hab jetzt die Fehlermeldung:

    TestDLL error C2275: 'structtest': Ungültige Verwendung dieses Typs als Ausdruck
    


  • Arbeitest du mit C? In dem Fall brauchst du entweder "struct structtest" oder "STRUCTTEST" in der Deklaration.



  • Danke 🙂

    PS. Super Forum!!! 👍



  • Struktur in C++ machst so

    struct structtest
    {
       char Text[21];
       float Wert1;
       float Wert2;
    }
    

    lounsome schrieb:

    void Zeigeruebergabe(void)
    {
    structtest Test[500]; 
    memset(Test, 0 , sizeof(structtest) * 500);
    
    TestFunktion(???);
    }
    

    Du weist aber, dass du hier 500 Strukturen erstellen lässt.
    Ansonsten einfach den Feldnamen als Parameter einsetzen, so haste den Zeiger auf das erste Element. Da wirst aber nen Fehler bekommen, weil die Typen nicht stimmen. Da brauchst nen brachialischen Cast. Und komisch sieht das schon aus, was du da willst. Sicher das die ganze Struktur und nicht nur der char-Teil der Struktur verlangt ist?



  • Doch das ist sicher.
    Das mit den 500 structs ist nicht mal übertrieben. Die Befüllung der struct\s übernimmt ein anderes Prog., ich muss diese struct`s nur noch mit meinen vergleichen.

    d.h. Ich befülle in meiner DLL genau so viele Strukturen und vergleiche diese miteinander.



  • Pellaeon schrieb:

    lounsome schrieb:

    void Zeigeruebergabe(void)
    {
    structtest Test[500]; 
    memset(Test, 0 , sizeof(structtest) * 500);
    
    TestFunktion(???);
    }
    

    immer dieses memset... 🙄

    wieso nicht:

    structtest Test[500] ={};
    

    diese unnötige verwendung von memset ist nur ein wartungsalbtraum, insbesondere, wenn so wie hier, die grösse des arrays direkt eingetragen wurde - es hätte wnigestens:

    memset(Test, 0 , sizeof Test);
    

    heißen können.



  • camper schrieb:

    Pellaeon schrieb:

    lounsome schrieb:

    void Zeigeruebergabe(void)
    {
    structtest Test[500]; 
    memset(Test, 0 , sizeof(structtest) * 500);
    
    TestFunktion(???);
    }
    

    immer dieses memset... 🙄

    Hey is ja nicht von mir 😛 hab auch nur gequotet. Aber ob deins klappt is auch fraglich. Da ie struct ja nur ne Klassen ist, und ich dachte floats ud ints werden nicht automatisch mit 0 initialisiert



  • Warum nicht die Variante:

    typedef struct structtest
    {
    char Text[21];
    float Wert1;
    float Wert2;
    } STRUCTTEST*;

    dann wird automatisch ein Zeiger auf die struct angelegt. 😉

    codeman



  • typedef struct structtest
    {
    char Text[21];
    float Wert1;
    float Wert2;
    }STRUCTTEST*;

    funzt nicht.



  • Mach bitte mal den Stren ganz hinten Weg...
    Und sag nächstesmal was für ein Fehler du bekommst...



  • Ohne Stern funktioniert`s ja.
    Mit Stern hab ich:

    TestDLL error C2143: Syntaxfehler: Es fehlt ';' vor '*'
    

    Is mir aber auch klar das der das nicht nimmt.



  • codeman schrieb:

    Warum nicht die Variante:

    typedef struct structtest
    { } STRUCTTEST*;

    Um einen Typedef für den Zeiger zu setzen, ist die Reihenfolge falsch:

    typedef struct test
    {
      //... Member-Variablen
    } *PTEST;
    


  • warum benutzen immer noch so viele das typedef bei ner Struktur 😕



  • Ich glaube, weil du so direkt eine Strukturvariable hast.
    Dann kann man aber nicht 2 Objekte der Struktur anlegen, oder ist da wieder ein Denkfehler? 😕



  • ich würd eher sagen, weil noch viele C++ Bücher C-verseucht sind o_O



  • Pellaeon schrieb:

    Hey is ja nicht von mir 😛 hab auch nur gequotet. Aber ob deins klappt is auch fraglich. Da ie struct ja nur ne Klassen ist, und ich dachte floats ud ints werden nicht automatisch mit 0 initialisiert

    nö, keine frage - eindeutig nach 8.5.1/7:

    If there are fewer initializers in the list than there are members in the aggregate, then each member not explicitely initialized shall be default-initialized(8.5).

    eine leere initialiererliste fällt nat. auch darunter und da structtest ein POD ist, heisst das, dass alle array-elemente zero-initialisiert werden. das ist im übrigen nicht das, was memset (logisch) tut - eine representation aus 0-bytes muss keineswegs der float-0 entsprechen. dass sie das auf dieser platform (x86) tut, soll dabei nicht bestritten werden.



  • Pellaeon schrieb:

    warum benutzen immer noch so viele das typedef bei ner Struktur 😕

    Erstens ging aus dem Ausgangspost nicht genau hervor, ob von C oder C++ die Rede war (bzw. alles dort könnte auch C Code sein), zweitens habe ich keinen typedef für eine struct hingeschrieben, sondern für "Pointer auf eine struct" und drittens schau dir mal ein paar der MFC-Header an 😉


Anmelden zum Antworten