PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C Struktur Alignment


liquid
2003-08-17, 21:03:26
Hi Leute,
folgender Code:

struct BMPFileHeader
{
ushort type; // identifies the bmp-file (always 19778 ("BM"))
ulong size; // total file-size in bytes

ulong reserved; // 4 bytes padding (should be 0)

ulong offBits; // offset to the image data (from file start)

ushort padding; // 2 bytes padding
};

funktioniert aufgrund des 32-bit Alignment meines Compilers (GCC-3.2) nicht richtig.
Ich bin jetzt schon soweit, dass ich rausgefunden habe, dass es nach type noch 2 Bytes padding einschiebt und danach erst size kommt.
Das soll er allerdings nicht machen, sonst funzt das ganze nämlich überhaupt nicht.

Also Compiler klar machen, dass er die Struktur nicht alignen soll (extern ist sie ja aligned -> sollten 16 Bytes sein).
So, Standardalignment ist ja 32-bit (4 Bytes). Ich denke das beste wäre das auf 16 Bits zu reduzieren.

#pragma pack (push, 2)
und
#pragma pack (pop)

eingefügt, aber es tut sich nichts. Der Fehler ist immer noch da. Was tun Leute? Funzen die pragmas beim GCC vielleicht nicht und wenn dem so ist, was soll man dann machen??

cya
liquid

Xmas
2003-08-17, 21:30:46
__attribute__((packed)) oder -fpack-struct könnten helfen.

http://www.delorie.com/djgpp/v2faq/faq22_11.html

liquid
2003-08-17, 22:02:58
Thx@Xmas


struct BMPFileHeader
{
ushort type; // identifies the bmp-file (always 19778 ("BM"))
ulong size __PACKED; // total file-size in bytes

ulong reserved __PACKED; // 4 bytes padding (should be 0)

ulong offBits __PACKED; // offset to the image data (from file start)
};

mit

#define __PACKED __attribute__((packed))

läuft es jetzt. Das letzte Paddingbyte musste auch entfernt werden, jetzt ist die Struktur nur noch 14 Bytes groß. Aber auf jeden Fall klappt es!

cya
liquid