Forum: Compiler & IDEs struct-Grösse automatisch anpassen


von Peter (Gast)


Lesenswert?

Hallo,

ich möchte ein struct automatisch so padden, dass die Grösse immer ein 
Vielfaches von 64 ist. Das wenn möglich automatisch vom 
Compiler/Preprocessor:

1
typedef struct
2
{
3
    u8 foo1;
4
    u16 foo2;
5
    u8 padder[????]
6
} tPaddedStruct;

Gibt's da eine Möglichkeit ?

Gruss und Danke

von der mechatroniker (Gast)


Lesenswert?

Wenns nicht portabel sein muss: schau in der Doku, ob dein Compiler 
entsprechende __attribute oder #pragmas kennt.

von Laszlo H. (mobius)


Lesenswert?

mach eine Union drum herum. Also
1
typedef union{
2
    uint64_t padding;
3
    struct {
4
       uint8_t val;
5
       uint16_t val2;
6
    }; 
7
}tPaddedStruct

Nicht ganz optimal, da du selber für das vielfache sorgen musst, aber 
für 1x 64bit geht das. Ansonsten bleibt dir wirklich 
Compiler-spezifisches byte aling auf 64bit adressen.

Wär halt mein Lösungsansatz.
gruß
Mobius

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

Ein kleines Script (Perl, Phython) sollte das auch erledigen können 
falls es der Compiler nicht kann.

Matthias

von Oliver (Gast)


Lesenswert?

Peter schrieb:
> ich möchte ein struct automatisch so padden, dass die Grösse immer ein
> Vielfaches von 64 ist.

Rein interessehalber:

Warum?

Oliver

von Peter (Gast)


Lesenswert?

@Oliver: Weil diese Strcut in einem EEPROM dreifach gesichert wird. 
Dieses EEPROM eine Pagesize von 64Byte hat und ich sicherstellen möchte 
das das Schreiben einer Struct keinen Einfluss auf schon geschriebene 
Daten hat (das wäre aber der Fall, wenn Teile von 2 Struct's eine Page 
verwenden würden).

Gruss

von Oliver (Gast)


Lesenswert?

Hm, ich würde das über die Zuordnung von Blöcken/Adressen im EEPROM zu 
den Variablen lösen. Ein Block (oder zwei, oder drei), ein struct. Das 
kann man dann alles im Programm zur Laufzeit einrichten. Irgend eine 
Möglickeit der direkten Adressierung wird das EEPROM ja wohl bieten.

Alternativ liesse sich zur Laufzeit ein Speicherblock mit 64byte (oder 
einem vielfachend davon) erzeugen, in den du die Daten der eigentlichen 
struct-Variable per memcopy hineinkopierst, und das alles zusammen dann 
ins EEPROM schreibst.

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.