const void * const * ?



  • Hallo allerseits,

    Ich verwende eine Funktion eines SDK, welche unter anderem folgende Parameter übergeben haben will:

    const char * const * ids // [in] Pointer to identifiers array.
    const void * const * templates // [in] Pointer to packed Template array.
    

    Ich hab meine Templates als BYTE* vorliegen, die identifiers sollen Nummern sein, also 01, 02, 03, etc... . Wie packe meine Daten am besten in das void* const* und char * const * Dingens und das möglichst ohne irgendwelche Speicherlecks zu verursachen? 😕
    Danke für die Hilfe.

    Schöne Grüsse,
    m.g.



  • Solange du nicht genau weisst, wofür die Parameter stehen und welches Format sie verlangen, kannst du nur spekulieren... Wenn du nicht gerade Glück hast, endet das in undefiniertem Verhalten.

    Mich verwirrt ein wenig, dass da Doppelzeiger vorkommen. Sag die Dokumentation oder ein Tutorial nicht mehr aus?



  • Nexus schrieb:

    Mich verwirrt ein wenig, dass da Doppelzeiger vorkommen.

    Vermutlich, weil 2 dimensionale Arrays vorkommen und man den Nutzer nicht zwingen wollte, die am Stück gespeichert zu haben... Aber da kann man ohne die implementierung zu kennen oder zumindest die doku gesehen zu haben nur raten...





  • Hallo,

    Mehr als das Zitat oben steht leider nicht in der Doku, aber ich weiss, wofür die Parameter stehen.

    Beispiel aus meinem Code:

    char ids[][3] = {"01", "02", "03", "04"};
    	char *pids = (char*)ids;
    	char * const * ppids = &pids;
    

    Das Beispiel funktioniert aber leider nicht wie es soll. Es wird nur der erste Eintrag in ppids gespeichert.

    In das void * const * sollen BYTE Arrays unterschiedlicher Länge, die als BYTE* vorliegen. Ich hab leider nicht wirklich eine Ahnung, wie ich das korrekt initialisiere.

    Danke für dir bisherige Hilfe und schöne Grüsse,
    m.g.



  • m.g. schrieb:

    Das Beispiel funktioniert aber leider nicht wie es soll.

    Wer hätte das gedacht. Sonst klappt es doch immer, wenn ich Casts zum Beheben von Fehlermeldungen einsetze. 🙄

    Im Ernst: Wahrscheinlich müsstest du dein Array dynamisch anlegen. So hättest du einen Zeiger auf einen Zeiger auf char . So als Anregung:

    char** outer = new char*[num_strings];
    for (...)
       outer[i] = new char[num_chars];
    // freigeben nicht vergessen
    

    Ich würde mir so eine üble Schnittstelle aber so schnell wie möglich sauber kapseln, um Fehler bei der Verwendung einzudämmen. Ist das eigentlich eine C- oder C++-Bibliothek?



  • Hallo,

    Ja, danke für die Hilfe. Werde es so machen. Hab allerdings immer noch keinen Schimmer wie ich das mit dem Void lösen soll. So ist es ja wohl nicht richtig.

    BYTE* bin_template = base64_decode(test_data, buf_size);
    void **templates = new void*[1];
    templates[0] = bin_template;
    

    Die ganze Aktion dient dazu die Funktion benuzerfreundlich zu kapseln. Bin also schon dabei. Das Handbuch zu dem SKD sagt übrigens folgendes: C/C++ Reference. 🙄

    Schöne Grüsse,
    m.g.


Anmelden zum Antworten