Ersatz für Datenstruktur 'Vector'



  • Hallo,

    ich nutze zur Zeit die Datenstruktur 'Vector' um Datenpakete unterschiedlicher Länge zwischen einer Anwendung und einer DLL auszutauschen.
    Ich würde allerdings gern auf den Vector verzichten und eine Lösung in 'reinem C'
    bevorzugen.
    Beim Auslesen eines Datenpakets aus der DLL hab ich dann allerdings das Problem, dass ich vorher nicht weiss wieviel Speicher ich für dieses Datenpaket benötige.

    Hat da vielleicht jemand einen Vorschlag wie ich das lösen könnte?

    Danke
    sid



  • verstehe nicht was das jetzt mit dll zu tun haben soll. du kannst funktionen in einer dll genauso aufrufen wie andere auch und pointer etc. über- und zurückgeben 😕 achte nur auf speicher den die dll alloziert am besten auch von der dll wieder freigeben zu lassen



  • Ok ich versuchs nochmal zu erklären. Ich habe in meiner DLL eine Funktion read(). Dieser Funktion wird ein Pointer auf einen Vector übergeben.
    Der Vector wird vor dem Lesen in der Hauptanwendung erstellt. Die DLL 'füllt' ihn dann über den Pointer mit n-Bytes.

    Nun würde ich statt des Vectors gern eine 'reine C' Datenstruktur verwenden. Auch hier könnte ich ja zB.: einen Pointer auf ein Array übergeben. Das Problem: ich weiss vorher nicht wieviel Speicher ich für das Array benötige.

    Ich würde nur ungern malloc benutzen oder eine 2. Funktion einführen, um die Größe des Datenpakets zu ermitteln...



  • Du kannst eine Funktion anbieten, die mitteilt, wieviele Bytes verfügbar sind.

    Oder du kannst das in etwa so machen:

    length: gibt die buffer grösse an.
    return value: gibt an wieviele bytes effektiv in buffer geschrieben wurden (nie mehr als length)

    long getData(unsigned char* buffer, long length)
    {
       // .. 
    }
    

    Und das rufst Du solange auf, bis keine Daten mehr verfügbar sind.
    (so ähnlich wie recv(..))

    Oder Du könntest den Buffer erzeugen und zerstören in der DLL:

    // buffer und length sind output parameter...
    void aquireData(unsigned char** buffer, long* length)
    {
       *buffer = new ...
       *length = ...
       // ...
    }
    
    void releaseData(unsigned char** buffer)
    {
       delete *buffer;
       *buffer = 0;
    }
    

    Simon


  • Mod

    Viele Windows API Funktionen haben auch die Möglichkeit mit der Übergabe eines NULL Zeigers zu ermitteln wieviel Speicher die Funktion anbieten muss damit ale Datn hineinpassen.



  • Danke für eure Hilfe.
    Ich werd mal die Variante mit dem Null-Zeiger probieren. Erscheint mir jetzt erstmal die einfachste und effektivste Lösung.


Anmelden zum Antworten