Bytezugriff auf struct

03/01/2008 - 14:16 von Olaf Kaluza | Report spam
Ich hab da mal eine Frage.

Bei folgender Definition:

#define MDATLEN 16
struct multibustype{
unsigned char Crc;
unsigned char BlockType;
unsigned char DeviceID;
unsigned char DeviceNr;
unsigned char DatenType;
struct ticker Ticker;
union status_def Status;
unsigned char Len;
unsigned char Daten[MDATLEN];
};

union multibus_def{
struct multibustype s;
char b[MDATLEN+8];
};

Kann ich mich da darauf verlassen das bei einer damit definierten
Variablen beides auf dasselbe Byte im Speicher zugreift?

MultiBlockS.s.Crc

also gleich ist mit

MultiBlockS.b[0]

Und zwar bei der Uebersetzung auf verschiedenen Prozessoren, unter
beachtung der besonderen Erschwernis das einer 68k basiert und einer
Intelmaessig auf den Speicher zugreift.

Und falls das nicht geht, wie macht man es richtig?

Olaf
 

Lesen sie die antworten

#1 Rainer Weikusat
03/01/2008 - 15:22 | Warnen spam
Olaf Kaluza writes:
#define MDATLEN 16
struct multibustype{
unsigned char Crc;
unsigned char BlockType;
unsigned char DeviceID;
unsigned char DeviceNr;
unsigned char DatenType;
struct ticker Ticker;
union status_def Status;
unsigned char Len;
unsigned char Daten[MDATLEN];
};

union multibus_def{
struct multibustype s;
char b[MDATLEN+8];
};

Kann ich mich da darauf verlassen das bei einer damit definierten
Variablen beides auf dasselbe Byte im Speicher zugreift?

MultiBlockS.s.Crc

also gleich ist mit

MultiBlockS.b[0]



Nicht generell, denn die Elemente der Struktur duerften durch beliebig
grosse 'Zwischenraeume' getrennt sein. Praktisch im allgemeinen schon,
weil solche Zwischenraeume dafuer benutzt werden, korrektes (oder
sinnvolles) Alignment der Elemente zu erzielen und es normalerweise
moeglich ist, die Struktur so zu definieren, dass es kein misaligment
gibt. Problematisch koennte zB Ticker sein, weil ihm fuenf einzelne
Bytes voranstehen. Dafuer muesstest Du ggf entweder die
Strukturdefinition entsprechend aendern oder den benutzten Compiler
auf eine geeignete Weise instruieren, kein padding[*] zu verwenden.

[*] Die erste Variante ist 'fuer manche Compiler' (read: gcc)
besser, denn gegebenenfalls wird auf alle Elemente einer
'ge-packten' Struktur byte-fuer-byte zugegriffen, egal, ob das
notwendig ist, oder nicht.

[...]

Und falls das nicht geht, wie macht man es richtig?



In jedem Fall (soweit mir bekannt) 'implementierungsabhaengig'.

Ähnliche fragen