|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
[C] Problema sizeof struct
Ho un problema con una sizeof di un record di questo tipo
Codice:
struct Frame_header { unsigned short lf;//header lenght unsigned char p;//semple precision unsigned short x;//larghezza unsigned short y;//altezza unsigned char nf;//number of image component void *components;// components }; ma non dovrebbe essere 12?? Invece se scrivo il record cosi: Codice:
struct Frame_header { unsigned short lf;//header lenght unsigned short x;//larghezza unsigned short y;//altezza unsigned char p;//semple precision unsigned char nf;//number of image component void *components;// components }; qualcuno sa dirmi perchè?? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Per motivi di performance (e - su alcuni sistemi - di limiti di accesso non allineato), il compilatore inserisce alcuni campi di padding in modo che i campi successivi siano propriamente allineati. Quello che ottieni nella pratica è:
Codice:
struct Frame_header { unsigned short lf;//header lenght unsigned char p;//semple precision char __padding1; //così x è allineato allo "short" (2 byte) unsigned short x;//larghezza unsigned short y;//altezza unsigned char nf;//number of image component char __padding2[3]; // così components è allineato a sizeof(void *); 4 byte su sistemi a 32 bit void *components;// components };
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Probabilmente c'entra l'allineamento della memoria
Ciao
__________________
GPU Compiler Engineer |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
E' una questione di allineamento nella memoria... Il compilatore cerca sempre di allocare le variabili da 4 byte sempre in una locazione multipla di 4 byte...mentre quelle da 2 byte in un multiplo di 2...
Quindi: [0] unsigned short lf;//header lenght [2] unsigned char p;//semple precision [sarebbe 3, ma deve essere multiplo di 2, quindi 4] unsigned short x;//larghezza [6] unsigned short y;//altezza [8] unsigned char nf;//number of image component [in 9 non può, e nemmeno in 10, quindi 12] void *components;// components [Totale 16 byte] [0] unsigned short lf;//header lenght [2] unsigned short x;//larghezza [4] unsigned short y;//altezza [6] unsigned char p;//semple precision [7] unsigned char nf;//number of image component [8] void *components;// components [Totale 12 byte] |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
1) sto usando windows XP e sto compilando con LCC-WIN32
2) Vorrei usare quel record per leggere da un file quindi non mi posso permettere padding. 3) Come posso Fare...... Grazie!! |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
#pragma pack(1) ... definizione strutture ... #pragma pack()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
Un grande grazie ragazzi sapete sempre tutto!!!
tanto per espandere la domanda, il tag "#pragma" a cosa serve (oltre a questo) che non l'ho mai capito?? Grazie Ancora !! |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
ah si scusate quello non l'ho tolto, solo la prima parte va letta direttamente, il puntatore va messo dopo, ma intanto senza il puntatore il problema e lo stesso!
Grazie ancora (non credo di essere in grado di fare la grandissima cavolata di leggere un puntatore da un file...) ciao!! |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
Ribadisco!! un grandissimo Grazie!!
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Mmm, scusa, ma io non credo ci sia bisogno di #pragma per leggere una struttura da un file
![]() Sbaglio? Io non l'ho mai fatto, se ci dobbiamo pure preoccupare dell' allineamento della memoria adesso (tra l'altro gestita in modo trasparente dal compilatore) . Per me basta un : fread(&struttura, sizeof(struttura), 1, file); Se invece il file non è stato memorizzato tramite una fwrite ad una struttura dello stesso tipo consiglio un parsing del file e poi un assegnamento elemento per elemento Ciao
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 06-02-2006 alle 11:38. |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Anonimo: dipendende da come è stato scritto il file, ovvio che se è stato scritto con lo stesso allineamento lo potrai leggere tranquillamente...ma se è stato scritto senza llineamento, magari da un altro programma, o addirittura da un altro dispositivo, dell'allineamento ci deve preoccupare...eccome...
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Se una struttura con dati "allineati" dal compilatore la scrivi su file e poi la rileggi ... non c'è problema (beh, anche nel file avrai dei padding, ovviamente). Ma se il file deve essere fatto in un certo modo ben preciso, allora l'allineamento ti deve importare eccome! ![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
Per fermare la disputa....
sto leggendo file jpeg, quindi conta l'allineamento! ciao!! |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:03.