1. #1
    Blood_Raven's Avatar
    Registered
    17/07/02
    Location
    U.S.
    Posts
    2,348
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/61

    [PROG][C] Pragma Pack

    Ik heb volgende structure:
    Code:
    #pragma pack(push,2)
    typedef struct
    {
    	WORD	bfType;
    	DWORD	bfSize;
    	WORD	bfReserved1;
    	WORD	bfReserved2;
    	DWORD	bfOffBits;
    } BITMAPFILEHEADER;
    #pragma pack(pop)
    En deze moet ik omzetten naar een structure van dezelfde grootte zonder de pragma stack te gebruiken.
    Is er een makkelijke manier om dit te doen?
    Waar kan ik eventueel meer informatie vinden over de pragma stack?
    no votes  

  2. #2

    Registered
    12/10/02
    Location
    mars
    Posts
    14,319
    iTrader
    2 (100%)
    Mentioned
    0 Post(s)
    Reputation
    0/0
    zelfde grootte :
    Code:
    typedef struct
    {
    	WORD	a;
    	WORD	b;
    	WORD	c;
    	WORD	d;
    	WORD	e;	
    	WORD	f;
    	WORD	g;
    } evenGroteStruct;
    Om met dezelfde velden te werken: geen idee, denk zelfs dat dat niet mogelijk is zonder pack, zelfs al order je mooi op DWORD,DWORD,WORD,WORD,WORD kom je nog aan 16 byte, maar ik ben dan ook weer niet zo alwetend over dat pack-gedoe, maar enkele keren bekeken .
    no votes  

  3. #3
    Blood_Raven's Avatar
    Registered
    17/07/02
    Location
    U.S.
    Posts
    2,348
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/61
    Ik heb een testje geprobeerd:

    Structures:
    Code:
    #pragma pack(push,2)
    typedef struct
    {
    	WORD	bfType;
    	DWORD	bfSize;
    	WORD	bfReserved1;
    	WORD	bfReserved2;
    	DWORD	bfOffBits;
    } BITMAPFILEHEADER;
    #pragma pack(pop)
    
    typedef struct
    {
            WORD	bfType;
            DWORD	bfSize;
    	WORD	bfReserved1;
    	WORD	bfReserved2;
    	DWORD	bfOffBits;
    } TEST;
    Code:
    Code:
    int main(void)
    {
        FILE *bitmap;
        BITMAPFILEHEADER fileheader;
        TEST test;
    
        bitmap = fopen("hallo3.bmp","rb");
        
        if(bitmap)
        {
            
            fread(&test.bfType, sizeof(WORD),1,bitmap);
            fread(&test.bfSize, sizeof(DWORD),1,bitmap);
            fread(&test.bfReserved1, sizeof(WORD),1,bitmap);
            fread(&test.bfReserved2, sizeof(WORD),1,bitmap);
            fread(&test.bfOffBits, sizeof(DWORD),1,bitmap);
            
            rewind(bitmap);
            fread(&fileheader, sizeof(BITMAPFILEHEADER),1,bitmap);
        }
    ...etcetera...
    }
    Beiden zijn correct en geven dezelfde waarden.
    Maar... fread(&fileheader, sizeof(TEST),1,bitmap); stuit op verkeerde resultaten.
    no votes  

  4. #4

    Registered
    12/10/02
    Location
    mars
    Posts
    14,319
    iTrader
    2 (100%)
    Mentioned
    0 Post(s)
    Reputation
    0/0
    doe nekeer sizeof

    want die zijn volgens mij niet even groot ze.
    no votes  

  5. #5
    dJeez's Avatar
    Registered
    17/07/02
    Location
    Sol System
    Posts
    10,064
    iTrader
    1 (100%)
    Mentioned
    0 Post(s)
    Reputation
    27/78
    Als het over een MS compiler gaat : http://msdn2.microsoft.com/en-us/library/2e70t5y1.aspx

    Door de offsets te testen in de respectievelijke structuren zal je direct zien wat je moet aanpassen.
    PSN: dJeezBE - Delicious bookmarks
    Disclaimer: I am currently suffering from severe CSD (Compulsive Sarcasm Disorder). - L'onion fait la farce - Facile largire de alieno
    Pastafarian by choice
    no votes  

  6. #6
    Blood_Raven's Avatar
    Registered
    17/07/02
    Location
    U.S.
    Posts
    2,348
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/61
    Quote Originally Posted by killgore
    This quote is hidden because you are ignoring this member. Show
    doe nekeer sizeof

    want die zijn volgens mij niet even groot ze.
    Idd dat is het em juist, ze zijn niet even groot.
    thx dJeez, dat ga ik eens proberen.
    Het gaat btw niet om een Microsoft compiler.
    Ik gebruik DevC++.


    Offsets:
    BITMAPFILEHEADER: 0,2,6,8,10
    TEST: 0,4,8,10,12

    Maar hoe zorg ik er nu voor dat in mijn struct TEST de eerste wel 2 is?
    Last edited by Blood_Raven; 05-07-2006 at 23:47.
    no votes  

  7. #7
    BuiZe's Avatar
    Registered
    08/08/02
    Posts
    134
    iTrader
    4 (100%)
    Mentioned
    0 Post(s)
    2 semi-offtopic vraagjes hierbij:
    - BITMAPFILEHEADER is gedeclareerd in Wingdi.h, waarom herdeclareren?
    - Dev-C++ gebruikt MingW32 (gcc), en deze ondersteunt #pragma pack, waarom het dan niet gebruiken?
    no votes  

  8. #8
    Blood_Raven's Avatar
    Registered
    17/07/02
    Location
    U.S.
    Posts
    2,348
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/61
    Quote Originally Posted by BuiZe
    This quote is hidden because you are ignoring this member. Show
    2 semi-offtopic vraagjes hierbij:
    - BITMAPFILEHEADER is gedeclareerd in Wingdi.h, waarom herdeclareren?
    - Dev-C++ gebruikt MingW32 (gcc), en deze ondersteunt #pragma pack, waarom het dan niet gebruiken?
    Omdat ik dit hele zootje ga verwerken naar devkitPro dat dan kan gecompileerd worden met GCC en ndslib (voor Nintendo DS).
    Deze heeft niet die benodigde header en gaf mij ook de melding dat ik geen pragma stack mocht gebruiken.
    Bezie het werk dat ik in DevC++ doe maar als 'kladwerk'.
    Het kost me minder moeite om voorlopig ff DevC++ te pakken, da's 1 klik compile en resultaat.

    Ik heb voorlopig mijn bovenstaande functie rap even gebruikt ter test, alhoewel ik deze te omslachtig vind, en ik krijg al wat posities te zien op het scherm van de DS Emulator. (BMP die schuin en ondersteboven staat)
    Last edited by Blood_Raven; 06-07-2006 at 01:17.
    no votes  

  9. #9
    BuiZe's Avatar
    Registered
    08/08/02
    Posts
    134
    iTrader
    4 (100%)
    Mentioned
    0 Post(s)
    mijn oplossing: een hoop typecasting via macro's
    http://rafb.net/paste/results/85hNJW90.html
    waarschuwing: ik ben totaal geen C-programmeur en heb geen idee in hoeverre dit portable is.
    no votes  

  10. #10

    Registered
    12/10/02
    Location
    mars
    Posts
    14,319
    iTrader
    2 (100%)
    Mentioned
    0 Post(s)
    Reputation
    0/0
    Quote Originally Posted by BuiZe
    This quote is hidden because you are ignoring this member. Show
    mijn oplossing: een hoop typecasting via macro's
    http://rafb.net/paste/results/85hNJW90.html
    waarschuwing: ik ben totaal geen C-programmeur en heb geen idee in hoeverre dit portable is.
    Ik heb niet direct naar jouw oplossing gekeken, maar als je die velden wilt behouden & dezelfde grootte wilt hebben zonder het pragma pack statement zal je volgens mij ook moeten prutsen met casten & pointers. Ik zie niet in hoe je het anders onder de 16 krijgt.
    no votes  

  11. #11

    Registered
    30/07/03
    Posts
    626
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/0
    Quote Originally Posted by Blood_Raven
    This quote is hidden because you are ignoring this member. Show
    Omdat ik dit hele zootje ga verwerken naar devkitPro dat dan kan gecompileerd worden met GCC en ndslib (voor Nintendo DS).
    Deze heeft niet die benodigde header en gaf mij ook de melding dat ik geen pragma stack mocht gebruiken.
    Bezie het werk dat ik in DevC++ doe maar als 'kladwerk'.
    Het kost me minder moeite om voorlopig ff DevC++ te pakken, da's 1 klik compile en resultaat.

    Ik heb voorlopig mijn bovenstaande functie rap even gebruikt ter test, alhoewel ik deze te omslachtig vind, en ik krijg al wat posities te zien op het scherm van de DS Emulator. (BMP die schuin en ondersteboven staat)
    Yeay nog NDS developpers

    Ik heb zelf ook twee projecten die met DevKitPro compilen(alsook gewoon in Windows en Linux):

    COW(system library):
    http://cow.lifeisdigital.net

    AlterNova(game/graphics engine):
    http://alternova.lifeisdigital.net

    Die zijn open source(LGPL), dus die kan je gerust gebruiken als je er iets aan hebt.
    De rasterizer van de game/graphics engine werkt trouwens nog niet 100% op de Nintendo DS(maar er is wel al een demo werkende gekregen)
    [LifeIsDigital.net] - Mijn artikels, open source software en projecten!
    no votes  

  12. #12
    Blood_Raven's Avatar
    Registered
    17/07/02
    Location
    U.S.
    Posts
    2,348
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/61
    Quote Originally Posted by Vich
    This quote is hidden because you are ignoring this member. Show
    Yeay nog NDS developpers

    Ik heb zelf ook twee projecten die met DevKitPro compilen(alsook gewoon in Windows en Linux):

    COW(system library):
    http://cow.lifeisdigital.net

    AlterNova(game/graphics engine):
    http://alternova.lifeisdigital.net

    Die zijn open source(LGPL), dus die kan je gerust gebruiken als je er iets aan hebt.
    De rasterizer van de game/graphics engine werkt trouwens nog niet 100% op de Nintendo DS(maar er is wel al een demo werkende gekregen)
    'k Gaan eens piepen nor die engine. :P
    'k Ben nog mor me de basis bezig (heb PAlib geinstalleerd, da werkt pakken makkelijker maar ik heb de indruk dat ge wel wat boet in mogelijkheden).

    Bedankt voor de hulp alvast.
    Het macheert voorlopig, ik zal wel nog eens kijken naar BuiZe zijn oplossing.
    Ze werkt alvast.

    Enfin het begint al op iets te trekken.
    Last edited by Blood_Raven; 06-07-2006 at 14:24.
    no votes  

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

Log in

Log in