AVR ATMega - Zugriff auf Struct im Speicher mittels Offset

#3160910
Lesenswert?

Hallo,
ich habe folgendes Problem...
1
typedef struct {
2
  uint16_t Wert1;
3
  uint8_t Wert2;
4
  uint8_t Wert3;
5
} MyStruct;

Kann auf das oben stehende Struct auch über ein Offset (Byte-Schritte) 
zugreifen, so in dieser Art: Gebe mir ein Byte an Offset 2 zurück. Das 
wäre hier Wert2.

Soviel ich weiss wird der Inhalt eines Structs im Speicher gepackt und 
verteilt. Wie kann ich an diese Problematik rangehen ?

Danke und Gruss,
Wolfgang
Gast #3160915
Lesenswert?

Grundsätzlich geht das. Es ist nicht vom Sprachstandard gedeckt, wird 
aber so oft verwendet das fast alle Compiler das selbe machen, bzw. mit
1
#pragma pack

dazu gezwungen werden können keine Lücken zwischen den Elementen zu 
lassen.
Gast #3160922
Lesenswert?

Meister, das Kapitel über Strukturen kommt hinter dem über Zeiger.

Aber gut:
1
#pragma pack
2

3
typedef struct {
4
  uint16_t Wert1;
5
  uint8_t Wert2;
6
  uint8_t Wert3;
7
} MyStruct;
8

9
MyStruct a;
10
char * b = (char * ) & a;
11

12
char c = *b;
#3160924
Lesenswert?

Wolfgang Huse schrieb:
> Ok, da hab ich einen Ansatz um mich einzulesen...
>
> Etwas Beispielcode wie der Zugriff aussieht hast Du auch evtl ? ;-)

Es gibt im wesentlichen 2 Möglichkeiten.
Beide sind in dem Sinne nicht koscher, als beide zu undefiniertem 
Verhalten führen, wenn man streng nach dem Buchstaben des Gesetztes 
geht.

Der erste Weg führt über eine entsprechende union mit einem entsprechend 
großen Array aus unsigned char.

Der zweite Weg führt über einen profanen Cast eines Pointers. Pointer 
auf die Struktur bilden, auf einen Pointer nach unsigned char umcasten 
und ... zugreifen.
Gast #3160932
Lesenswert?

>heisst das beim GCC nicht
1
__attribute__((__packed__))
?

Meine Güte. Bei der einen Frau heisst es: "Du hast schöne Augen." bei 
der anderen "Du hast wundervolles Haar." Der Zweck ist immer der 
gleiche.
#3160976
Lesenswert?

Also, nach einer Runde Doku heisst es:
1
typedef struct {
2
  uint16_t Wert1;
3
  uint8_t Wert2;
4
  uint8_t Wert3;
5
} __attribute__((packed, aligned(1))) MyStruct;

Das funktioniert auch wie gewünscht....

@stefan
Das heisst ich kann mir das sparen und direkt das Offset zum Zeiger 
addieren ?  Was ist mit den verschiedenen Aussagen dazu das ein Struct 
im Speicher optimiert abgelegt wird ?

In der Tat klappt es bei meinem kleinen Beispiel auch.. Aber wie ist das 
wenn die Struct später um einiges größer ist ?

/Edit: Tippfehler beseitigt...
Gast #3160986
Lesenswert?

>Was ist mit den verschiedenen Aussagen dazu das ein Struct
>im Speicher optimiert abgelegt wird ?

Die sind dem Grunde nach richtig. Nur das bei dem AVR die optimierung 
halt heisst: Byte-Aligned. Daher hat packed keinen Effekt, wenn der 
Parameter 1 ist.

>Aber wie ist das wenn die Struct später um einiges größer ist ?
Mit der Gesamtgrösse der Struktur hat das nichts zu tun. Es geht um die 
einzelnen Elemente.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren