Archief - [PROG][C] Pragma Pack

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Blood_Raven

Legacy Member
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?

killgore

Legacy Member
zelfde grootte :p:
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 ;).

Blood_Raven

Legacy Member
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.

killgore

Legacy Member
doe nekeer sizeof

want die zijn volgens mij niet even groot ze.

Blood_Raven

Legacy Member
killgore zei:
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?

BuiZe

Legacy Member
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?

Blood_Raven

Legacy Member
BuiZe zei:
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)

killgore

Legacy Member
BuiZe zei:
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.

Vich

Legacy Member
Blood_Raven zei:
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 :D

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)

Blood_Raven

Legacy Member
Vich zei:
Yeay nog NDS developpers :D

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.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan