Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Danke, und nun noch einen drauf....

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
05.09.2003, 14:27 Uhr
Ocrana



...mit dieser Frage. Soetwas habe ich noch nie gesehen, daher

Ich habe eine Struktur:


C++:
typedef struct socks_op {
    unsigned char vn;        /* socks version number */
    unsigned char cd;        /* command code        */
    unsigned char dstport[2];    /* destination port    */
    unsigned char dstip[4];        /* destination address    */
    unsigned char userid;        /* first byte of userid    */
    /* more bytes of the userid follow, terminated by a NULL    */
}socks_op;



diese Struktur wird ganz normal gefüllt, aber jetzt kommt ein aufruf:

C++:
write_socket(sfd, c, csiz)
//c = eine socks_op struktur


und in der Funktion sieht es so aus:


C++:
int write_socket(int fd, char *buf, int n)
{
    if(n <= 0) return(0);

    if(DEBUG(LOG)) fwrite(buf, n, 1, logfp);

    return send(fd, buf, n, 0);
}



Was der compiler anmeckert und was ich absolut nicht verstehe ist, wie eine strukt als char * übergeben werden kann/wird? Gibt es das überhaupt?

Gruß

Ocrana
--
-=ShrinkTo5 - The DVDShrink alternative=-
--=http://www.shrinkto5.com=--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.09.2003, 14:31 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ist c bei dir etwa ein socks_op?
an sonsten versteh ich deine frage nicht

wenn ja dann kann das meines wissens auch nicht gehen?
wie hast du c definiert?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.09.2003, 14:32 Uhr
0xdeadbeef
Gott
(Operator)


Sollte der Ausdruck nicht so:

C++:
write_socket(sfd, &c, csis); /* csis == sizeof(socks_op) ? */


oder besser noch so

C++:
write_socket(sfd, (char*) &c, csis);


aussehen? Pointer kann man untereinander hin- und hercasten, und ansonsten sieht mir diese Funktion danach aus, als sei sie dazu da, das struct zu serialisieren und über ein socket zu verschicken. Was zwischen Maschinen mit verschiedenem endian nicht hinhauen dürfte, aber naja.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.09.2003, 14:33 Uhr
typecast
aka loddab
(Operator)


Hier kannst du dieses struct nicht übergeben. Da bekommst du natürlich einen Compilerfehler, denn char* ist ein Pointer auf einen String und das ist etwas anderes als das struct. Du musst die einzelnen Elemente des structs auch einzelnd übergeben.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.09.2003, 14:34 Uhr
typecast
aka loddab
(Operator)


@beefy: Kann man den überhaupt so einen Cast machen?
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.09.2003, 14:36 Uhr
Ocrana



Hallo,

ja c ist eine Struktur socks_op (wie im Kommantar). Definiert ist es in dem code so:

struct socks_op *c = (struct socks_op *)cbuf;

Ist im übrigen ein GPL code von Linux den ich grad versuche zu verstehen.


was ich dann nicht ganz verstehe, wiso das Ding im originalcode läuft, aber in VC++ compiler diese Meldungen kommen?

Ocrana
--
-=ShrinkTo5 - The DVDShrink alternative=-
--=http://www.shrinkto5.com=--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.09.2003, 14:36 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@beefy
den cast hielt ich auch für sehr gewagt
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
05.09.2003, 14:37 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


wenns nicht zum laufen zu kriegen ist definier dir einen charbuffer und kopiere die chars der struktur in dem buffer und übertrag den
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 05.09.2003 um 14:38 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
05.09.2003, 16:11 Uhr
Tommix



Hallo,
ein C++-Compiler bemeckert das und ein C-Compiler nicht. Also in VC als Datei.c (nicht .cpp) speichern, dann schluckt er das. Ob man so was machen sollte sei mal dahin gestellt.

Gruss, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
05.09.2003, 16:33 Uhr
0xdeadbeef
Gott
(Operator)


Doch, so macht das schon Sinn.

c ist kein struct socks_op, sondern ein struct socks_op* (!), also ein Zeiger auf ein struct socks_op. Den Zeiger kann man als Zeiger auf alles mögliche interpretieren. In diesem Fall als char*, also Zeiger auf char bzw. einen String. Der wird dann zeichenweise in ein socket geschrieben, also serialisiert.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: