Forum: Compiler & IDEs byte alignement mit gcc


von Frank (Gast)


Lesenswert?

Hallo

Kann mir bitte jemand sagen wieso

sizeof(Info) den Wert 32 liefert?


#pragma pack(1)
typedef  struct
{
  unsigned int a ;
  unsigned int Speed;
  unsigned char time;
  unsigned char val2 ;
  unsigned int temp;
  unsigned char Food;
  unsigned char LimitSwitchState;
  char Timeout;
  unsigned int BufCount;
  unsigned char CurrentT;
  unsigned int FFactor;
  unsigned int SFactor;

}TInfo;


TInfo Info;



nach meiner Rechung müsste das Ergbenis 18 sein.

Habe schon verschiedene Versionen von pack versucht

Vielen Dank

Frank

von Frank (Gast)


Lesenswert?

kann es etwa sein, dass ein unsigned int bei einem ARM7 4 byte gross 
ist...:)?

von Wolfram (Gast)


Lesenswert?

>nach meiner Rechung müsste das Ergbenis 18 sein
dann schau nochmal in ein C Buch was
>sizeof(Info)
bedeutet.

von JJ (Gast)


Lesenswert?

Ja, der Datentyp unsigned int hat 4 Byte.

von Markus B. (Gast)


Lesenswert?

Hallo,
da der ARM eine 32 Bit Architektur besitzt würde ich das mal vermuten. 
Ganz einfach herauszufinden mit sizeof(int). Die Summe der Struct 
Elemente beträgt dann 30. Die restlichen 2 Bytes werden aufgefüllt um 
die Struct selbst int aligned zu bilden.

gruss
markus

von Joerg X. (Gast)


Lesenswert?

@alle Antworter:
Woher wisst ihr, dass der OP einen ARM, bzw. irgendeinen 32Bit-Proz. 
benutzt? staun
SCNR
um konstruktiv zu sein: wenn der µC irgendein Alignment bevorzugt, 
solltest du die "char"s (und evtl. auch "short"s) zu Zweier- 
(Vierer-)Gruppen umsortieren.

hth. -Jörg

von Rolf Magnus (Gast)


Lesenswert?

> @alle Antworter:
> Woher wisst ihr, dass der OP einen ARM, bzw. irgendeinen 32Bit-Proz.
> benutzt? *staun*

Weil er es selbst geschrieben hat.

Wozu soll die Struct überhaupt gepackt werden?

von Frank (Gast)


Lesenswert?

Hallo zusammen

Ich entwickle für den LPC2148:) In der Tat, der Compiler ziert sich 
etwas beim Packen. Ich habe mir nun damit geholfen, dass ich die 
einzelnen Variablen mit Hilfe von memcpy in einen Byte-Puffer kopiert 
habe. Nicht gerade effizient aber es funktioniert.

Interessieren würde es mich aber doch noch ob es irgendwie möglich ist.

Beste Grüsse und vielen Dank

Frank

von Frank (Gast)


Lesenswert?

Ach ja, die Struktur ist 32 byt gross... Wie Markus bereits hergeleitet 
hat..

von Mario (Gast)


Lesenswert?

Hast Du das schon gemacht?

struct test_t {
  int  a;
  char b;
  int  c;
} __attribute__((_packed_));

Quelle: http://sig9.com/articles/gcc-packed-structures

Mario

von Frank (Gast)


Lesenswert?

Hallo Mario

Vielen Dank für Deine Info. Diese Version habe ich erfolglos auch schon 
probiert. Trotzdem, vielen Dank.

Beste Grüsse
Frank

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.