Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-02-2006, 10: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, 10: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, 10: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, 10: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, 11: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, 11: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 developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 11: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, 11: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, 11: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, 11: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, 11: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 developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 11: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, 11: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 11:38.
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 11: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, 11: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 developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2006, 11: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


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La prima missione orbitale del razzo spa...
Servizi in streaming sempre più c...
Anteprima della Leapmotor B03X: inizia l...
Anthropic accusa la Cina: Claude utilizz...
I satelliti Rassvet (Starlink russo) di ...
Un agente IA ha risolto un problema su W...
Cina: la CMSA potrebbe cambiare parte de...
68 mensilità di bonus per i dipen...
Rocket Lab ha fatto ricorso contro la de...
Nutanix rende disponibile Azure Virtual ...
Il padrino del deep learning avverte: gl...
Il finto avviso "iPhone Storage is Full"...
Dietrofront in Cina, addio touchscreen p...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
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: 22:18.


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