Thread: [PROG][C] Pragma Pack
-
05-07-2006, 20:39 #1
[PROG][C] Pragma Pack
Ik heb volgende structure:
En deze moet ik omzetten naar een structure van dezelfde grootte zonder de pragma stack te gebruiken.Code:#pragma pack(push,2) typedef struct { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER; #pragma pack(pop)
Is er een makkelijke manier om dit te doen?
Waar kan ik eventueel meer informatie vinden over de pragma stack?no votes
-
-
05-07-2006, 21:52 #2Member
- Registered
- 12/10/02
- Location
- mars
- Posts
- 14,319
- iTrader
- 2 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 0/0
zelfde grootte
:
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 bekekenCode:typedef struct { WORD a; WORD b; WORD c; WORD d; WORD e; WORD f; WORD g; } evenGroteStruct;
.
no votes
-
05-07-2006, 22:31 #3
Ik heb een testje geprobeerd:
Structures:Code: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;
Beiden zijn correct en geven dezelfde waarden.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... }
Maar... fread(&fileheader, sizeof(TEST),1,bitmap); stuit op verkeerde resultaten.no votes
-
05-07-2006, 22:53 #4Member
- 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
-
05-07-2006, 23:06 #5Member
- 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 alienoPastafarian by choiceno votes
-
05-07-2006, 23:30 #6
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
-
06-07-2006, 00:51 #7
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
-
06-07-2006, 01:09 #8
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
-
06-07-2006, 01:56 #9
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
-
06-07-2006, 11:32 #10Member
- Registered
- 12/10/02
- Location
- mars
- Posts
- 14,319
- iTrader
- 2 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 0/0
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
-
06-07-2006, 11:44 #11
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
-
06-07-2006, 13:23 #12
'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
