Torna indietro   Hardware Upgrade Forum > Software > Programmazione

WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-02-2006, 11:39   #1
tglman
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
};
Il sizeof di questo record mi da come risultato 16...

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
};
è 12.......
qualcuno sa dirmi perchè??
tglman è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 11:56   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
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
};
Con la tua seconda soluzione tutti i campi risultano allineati alla loro dimensione naturale, così nessun padding è necessario.
__________________
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 11:57   #3
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Probabilmente c'entra l'allineamento della memoria

Ciao
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 11:59   #4
cionci
Senior Member
 
L'Avatar di cionci
 
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]
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 12:00   #5
tglman
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!!
tglman è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 12:11   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da tglman
2) Vorrei usare quel record per leggere da un file quindi non mi posso permettere padding.
Metti:
Codice:
#pragma pack(1)

... definizione strutture ...

#pragma pack()
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 12:14   #7
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da tglman
2) Vorrei usare quel record per leggere da un file quindi non mi posso permettere padding.
...stai leggendo un "void *" da un file!?
__________________
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 12:16   #8
tglman
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 !!
tglman è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 12:18   #9
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da ilsensine
...stai leggendo un "void *" da un file!?
Appunto...stai leggendo un puntatore da un file ?!?!?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 12:23   #10
tglman
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!!
tglman è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 12:27   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da tglman
tanto per espandere la domanda, il tag "#pragma" a cosa serve (oltre a questo)
che non l'ho mai capito??
#pragma serve, in generale, per passare al compilatore delle direttive speciali per gestire delle funzionalità specifiche dell'ambiente/compilatore/sistema operativo, come appunto l'allineamento dei dati o ad esempio la modifica dei warning o altro ancora.
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 12:29   #12
tglman
Senior Member
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
Ribadisco!! un grandissimo Grazie!!
tglman è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 12:36   #13
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
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 12:38.
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 12:41   #14
cionci
Senior Member
 
L'Avatar di cionci
 
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...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 12:48   #15
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da AnonimoVeneziano
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) .
Infatti ... normalmente puoi anche fregartene di come il compilatore allinea i dati nelle strutture, union, ecc...
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, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 12:56   #16
tglman
Senior Member
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
Per fermare la disputa....

sto leggendo file jpeg, quindi conta l'allineamento!
ciao!!
tglman è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
Da zero al tracciato in secondi: LibreCo...
Il regista Rian Johnson lancia a 12,99 d...
Microsoft stravolge l'app Sicurezza di W...
Mercato smartphone in caduta libera: -20...
Android 17 QPR3 Beta 3 riporta il blocco...
Le 10 offerte TOP in Amazon del weekend:...
Dyson, doppio crollo su Amazon: purifica...
Il 70% delle imprese non vede effetti de...
HillMiles MileCity1 a 616€: la city e-bi...
GAC Aion UT, prima prova: tanta roba a 2...
vivo X300 Pro a 979€: il top di gamma co...
AGIBOT fa ballare 110 Expedition A3 per ...
iPad A16 da 11'' scende a 459€ in tutti ...
Mac mini M6 crolla a 899€ (-180€ rispett...
Galaxy S27, la ricarica resta a 25W: lo ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:09.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v