Vorn Nachn schrieb:
> Meine Struktur:
>
1 | > typedef struct
|
2 | > {
|
3 | > struct
|
4 | > { int32_t foo ; // Foo Struct Member
|
5 | > int32_t bar ; // "
|
6 | > int32_t baz ; // "
|
7 | > } Foo ; //
|
8 | > struct
|
9 | > { char foobits:2, // Bar Struct Member
|
10 | > barbits:2, // "
|
11 | > bazbits:4; // "
|
12 | > } Bar[10] ; // Array aus 10 mal Bar Struktur
|
13 | > } Speicherdaten ; //
|
14 | >
|
15 | > Speicherdaten RAM_Data ; // RAM_Data = Struktur im RAM
|
16 | > Speicherdaten EEP_Data EEMEM; // EEP_Data =Struktur im EEPROM
|
17 | >
|
> Um nun nur die "Foo" Struktur ins EEPROM zu schreiben benutze ich
> folgende Codezeile:
>
1 | > eeprom_write_block(&RAM_Data,&EEP_Data,sizeof(((Speicherdaten*)0)->Foo));
|
2 | >
|
> klappt ebenfalls, ...
sei hier ein bischen expliziter. Das geht davon aus, dass der Foo Anteil
in der struct Speicherdaten am Anfang liegt. Es schadet nichts, wenn man
an dieser Stelle explizit hinschreibt was man haben möchte und nicht
implizit durch die Längensteuerung das Gewünschte erreicht.
1 | eeprom_write_block( & RAM_Data.Foo,
|
2 | & EEP_Data.Foo,
|
3 | sizeof( RAM_Data.Foo ) );
|
> allerdings nicht mit der Array-Struktur "Bar"...
>
1 | > eeprom_write_block(&RAM_Data,&EEP_Data,sizeof(((Speicherdaten*)0)->Bar[1]));
|
2 | >
|
siehst du. Hier hast du dich mit dem vorhergehenden selbst ausgetrickst,
indem du dort einen Zusammenhang ausgenutzt hast, den du hier nicht mehr
benutzen kannst.
Bist du hier aber genauso explizit, fügt sich eines ganz natürlich zum
anderen
1 | eeprom_write_block( & RAM_Data.Bar[1],
|
2 | & EEP_Data.Bar[1],
|
3 | sizeof( RAM_Data.Bar[1] ) );
|
> da ich die eeprom write block codezeile mit dem
> -> und den sternchen^^
Das sind Pointer.
Und in deinem speziellen Fall völlig unnötig. Das kann man auch ganz
logisch ohne so ein windiges Konstrukt schreiben.
write_block will:
Adresse von wo
Adresse wohin
Wieviele Bytes
das ist mehr oder weniger alles.
Der Rest (mit den Sternchen und so) findet sich in jedem C Buch