Struct / anordnung ???



  • Hi C gurus...

    Entweder ich zaehl falsch / vergess was / oder werd wahnsinnig...
    Folgenden struct wollte ich eigentlich nehmen um einen Bitmap header auszulesen:

    typedef struct Header {
    		unsigned short signature;
    		unsigned int sizeBmpFile_u;
    		unsigned int zeros;				// must be 0
    		unsigned int offsetImage;
    		unsigned int sizeBitmapInfoHeader; // must be 40
    		unsigned int width;
    		unsigned int height;
    		unsigned short planeCount;		// must be 1
    		unsigned short bpp;				// 1, 4, 8, 24
    		unsigned int compresionType;	// 0=none, 1=RLE-8, 2=RLE-4
    		unsigned int imageDataSize;		// including padding
    		unsigned int horizontalResolution_u; // pixels per meter 
    		unsigned int verticalResolution_u; // pixels per meter
    		unsigned int colorCount;		// could be 0
    		unsigned int importantColorCount; // could be 0;
    		} HEADER;
    	struct Header * head;
    

    der Header sollte also nur 54 byte gross sein wenn ich mir die groesse aber ausgeben lasse sinds 56.

    dann hab ich mir mal die ganzen offsets ausgeben lassen und hab gesehen das das 2te element IMMER!!! einen offset von 4 hat wenn ich einen typus ausser double nehme (der hat 8 byte und wuerd ja nich rein passen) aber mein erster typ is nun mal ein short das 2 bytes hat... auch ein char interresiert hier nicht viel.

    meine fragen also:
    1. warum ist das so?
    2. was genau muss ich machen um trotzem einen struct zu verwenden aber diesmal mit richtigen offsets (ausser umherbasteln)

    THX

    Ps. Ich benuze den M$ VC++ wenn ich mich aber richtig erinnere war das beim gcc genau so...



  • such mal nach padding

    // byte-align structures
    #ifdef _MSC_VER
    #	pragma pack( push, packing )
    #	pragma pack( 1 )
    #	define PACK_STRUCT
    #elif defined( __GNUC__ )
    #	define PACK_STRUCT	__attribute__((packed))
    #else
    #	error you must byte-align these structures with the appropriate compiler directives
    #endif
    

    setz den code vor deinen und alles wird gut



  • Vertexwahn schrieb:

    setz den code vor deinen und alles wird gut

    nicht ganz, du musst das PACK_STRUCT noch hinter die Deklaration setzen.



  • Funktioniert das dann auch mit dem gcc? oder muss ich da irgendwelche flags setzten?



  • Beim GCC schlägst Du am besten unter '__attribute__ ((packed))' in den Infoseiten nach.


Anmelden zum Antworten