C Probleme mit Typumwandlung

[tE]bachi

BSD Freak
Salü Zusammen!

Habe ein Problem bei der Typumwandlung von in6_addr auf eine von mir erstellte Struktur.

Code:
struct in6_addr {
    uint8_t s6_addr[16];
}

typedef struct {
    guint8 segment[16];
} TCPViewInetAddress;

Wenn ich das nun umwandle ,findet der Compiler das nicht gut
Code:
socket->local_address = (TCPViewInetAddress) inp->inp_laddr;
[...]
TCPViewSocketFBSD.c:171: error: conversion to non-scalar type requested

Wenn ich das mit einem Union verbinde, funktioniert es aber...
Code:
union {
    in6_addr a;
    TCPViewInetAddress b;
} convertor;

convertor.a = inp->inp_laddr;
socket->local_address = convertor.b;

Ist das die einzige Möglichkeit, oder gibt es doch eine Typumwandlung, die ich noch nicht kenne?

greets

[tE]bachi
 
Wäre es nicht vielleicht einfacher, dass mit dem Konstruktor von TCPViewInetAddress zu machen:
Code:
socket->local_address =  new TCPViewInetAddress(inp->inp_laddr);
?
 
[tE]bachi schrieb:
Code:
typedef struct  {
    guint8 segment[16];
} TCPViewInetAddress;

Das ist so nicht ganz korrekt. Entweder du machst die beiden Deklarationen getrennt:
Code:
struct tagTCPViewInetAddress {
    guint8 segment[16];
};

typedef struct tagTCPViewInetAddress TCPViewInetAddress;
Oder so
Code:
typedef struct tagTCPViewInetAddress {
    guint8 segment[16];
} TCPViewInetAddress;

Oder verzichtest ganz auf typedef.
 
Zuletzt bearbeitet:
so oder funktioniert es nicht bei der typumwandlung...
Code:
typedef struct _TCPViewInetAddress {
    guint8 segment[16];
} TCPViewInetAddress;
socket->local_address   = (struct _TCPViewInetAddress) inp->inp_inc.inc_ie.ie_dependladdr.ie6_local;
[...]
TCPViewSocketFBSD.c:164: error: conversion to non-scalar type requested

die union-form funktioniert aber!
 
Ich bin dafür, dass es zugewiesen wird und nicht gewandelt.

Ich weiß wirklich nicht, ob das erste Struktur-Element an Offset 0 bzgl. der Struktur anfängt. Ich würde an Deiner Stelle dem Strukturelement direkt zuweisen.

Und zweitens wird das wohl ohne ein memcpy() nicht gewandelt werden können.

Was Du da auch immer versuchst, es lässt sich besser machen, als auf diese Weise. Ich meine damit auch den Workaround, den ich Dir anbiete.
 
Habe herausgefunden, wie ich den union-workaround umgehen kann:
Ich nehme die Adresse von in6_addr (&(inp->inp_inc.inc_ie.ie_dependladdr.ie6_local)) , nehme dann eine andere Sicht der Dinge an (TCPViewInetAddress*) und speichere den Wert der Adresse in xsocket_entry->local_address (mit *)...

Code:
xsocket_entry->local_address    = *((TCPViewInetAddress*) &(inp->inp_inc.inc_ie.ie_dependladdr.ie6_local));

komisch, aber es funktioniert...

greets

[tE]bachi
 
Es ist halt C und nicht C++, da geht alles nur schrittweise.
Erst die Adresse der Struktur, dann Zeigerkonvertierung und wieder zu Daten ;)

Das wird übrigends als memcpy() aufgelöst :)
 
Zurück
Oben