Hi, ich habe folgenden Code: typedef struct{ union sc { UCHAR scbyChar; struct { USIGN8 x1 : 1; USIGN8 x2 : 1; USIGN8 x3 : 1; USIGN8 x4 : 1; USIGN8 x5 : 1; USIGN8 x6 : 1; USIGN8 iPData : 1; USIGN8 eD : 1; } scbyStruct; } scunion; union eq1 { UCHAR eqbyChar; struct { USIGN8 i : 3; USIGN8 r : 1; USIGN8 t : 2; USIGN8 m : 2; } eqbyStruct; } eq1union; USIGN16 ec1; union eq2 { UCHAR eqbyChar; struct { USIGN8 i : 3; USIGN8 r: 1; USIGN8 t : 2; USIGN8 m : 2; } eqbyStruct; } eq2union; USIGN16 ec2; [...] } eb_t; Jetzt belegt dieser dämliche IAR-Compiler für eq1 richtigerweise 1 Byte. Für eq2 reserviert er aber 2 Byte (bzw der Abstand zu ec2 beträgt 2 Byte). Woher kommt das zusätzliche Byte? "Optimierung"? Und vor allem: Wie werde ich es wieder los? Ich will mit Zeigern arbeiten, aber das vermasselt er mir hier gewaltig...
Karl-heinz Strunk wrote:
> Woher kommt das zusätzliche Byte? "Optimierung"?
Ich habe mal alle Optimierungen ausgeschaltet. Nutzt nichts.
Hallo, Variablen mit mehr als 1 Byte werden standardmässig immer an geraden Speicheradressen abgelegt ! Gruß Franky
> (bzw der Abstand zu ec2 beträgt 2 Byte).
16-Bit Prozessor?
Das Stichwort wäre dann Alignment.
Irgendwie solltest du deinen Compiler auf Byte-Alignment umstellen
können.
Lothar Miller wrote: >> (bzw der Abstand zu ec2 beträgt 2 Byte). > 16-Bit Prozessor? > Das Stichwort wäre dann Alignment. > Irgendwie solltest du deinen Compiler auf Byte-Alignment umstellen > können. Jau: #pragma pack(1) Und das geht auch. Wieder was gelernt! Danke Schön!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.