Dynamisches mehrdimensionales Chararray senden (Socket)



  • Hi Leute,
    wollte von meiner Client-Anwendung zu meiner Server-Anwendung ein mehrdimensionales(zweidimensional)Array schicken. Da aber die Definition von send() nur eindimensional erlaubt bin ich ratlos. Wie könnte man an dieses Problem rangehen? Danke schon mal im Voraus.
    lg
    Fischlinger



  • Wenn es ein echtes Array ist, dann ist das ein zusammenhängender Block, denn du auch auf einmal senden kannst.
    Wenn du aber mit Doppelzeigern arbeitest, wirst du die Teile einzeln versenden müssen.

    Echtes Array:
    char Text[100][80];
    
    //Doppelzeiger
    char **text = malloc(100*sizeof(char*));
    // und dann in der Schleife 100 mal 80 Zeichen besorgen
    


  • DirkB schrieb:

    [...]Doppelzeiger[...]

    Es gibt keine Doppelzeiger ⚠
    Das Wort macht es eigentlich noch komplizierter, als es ist.



  • Naja, Zeiger auf Zeiger als Doppelzeiger zu bezeichnen, halte ich grad noch für nachvollziehbar.



  • ... auch weil er mit einem doppelten * definiert wird.



  • Fischlinger schrieb:

    Da aber die Definition von send() nur eindimensional erlaubt bin ich ratlos. Wie könnte man an dieses Problem rangehen?

    Das ist falsch geschlussfolgert.
    Gemäß POSIX ist der send-Prototyp deklariert als

    ssize_t send(int sockfd, const void *buf, size_t len, int flags);
    

    Für buf steht da also const void* und nichts Eindimensionales.
    buf stellt also eine simple Adresse dar, ab der len Bytes übertragen werden sollen.
    Da kannst du alles mögliche reinschreiben, wichtig ist nur, dass keine "Lücken" im Nutzdaten-Bytestrom resultieren z.B. durch struct-Bytepadding oder Zeiger.
    Ein Array bietet sich hier an, denn ein Array in C ist gekennzeichnet durch eine lückenlose Aneinanderreihung von Elementen gleichen Typs.
    Und ein mehrdimensionales Array hat natürlich die gleichen Eigenschaften.
    Außerdem hast du mit den sizeof-Operator ein schönes Mittel zur Ermittlung des len-Arguments, also einfach

    unsigned char a[100];
    send(...,a,sizeof a,...);
    bzw.
    unsigned char a[100][100][100];
    send(...,a,sizeof a,...);
    bzw.
    unsigned int a[100];
    send(...,a,sizeof a,...);
    

    Du siehst also, die send-Aufrufzeile ändert sich nicht für verschiedene Arrays,
    wobei bei Elementen mit sizeof>1 die send-Gegenstelle natürlich mit deiner Ausgangsbyteorder klarkommen muss.



  • @Wutz: Also der Compiler beschwert sich über Folgendes.

    Das Argument vom Typ ""char(*)[10][2]"" ist mit dem Parameter vom Typ ""char *"" inkompatibel!
    

    Was soll das heißen?
    lg
    Fischlinger


  • Mod

    Fischlinger schrieb:

    Was soll das heißen?

    Na, das was da steht. Wenn die Variable a vom Typ char[10][20] ist, dann zerfällt der Ausdruck a zu einem char()[20] (d.h. ein Zeiger auf char[20]). Und so weiter für tiefere Verschachtelungen. Die Superklugscheißerschreibweise um einen char zu bekommen wäre also a[0] oder *a .

    Jedoch sollte das eigentlich kein Problem sein. Kann es sein, dass du einen C++-Compiler benutzt? Compiliert folgender Code bei dir?

    void *foo;
    int *bar = foo;
    

    Falls nicht: C++.



  • Und dann musst du nach void* casten.


Log in to reply