Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
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
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
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
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
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
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
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


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Samsung è sempre più prota...
ChatGPT ha pregiudizi politici? Ecco cos...
Un solo iPhone rubato ha portato alla sc...
Xiaomi 17 Ultra sta arrivando: ecco come...
Il Motorola Edge 70 non ha più se...
Alcuni Galaxy S26 utilizzeranno il chip ...
Amazon, ecco i super sconti del weekend:...
Scovare un bug di sicurezza sui disposit...
Offerta Amazon su NordVPN: proteggi 10 d...
ECOVACS DEEBOT X8 PRO OMNI in offerta su...
Scope elettriche Tineco in offerta su Am...
Offerta Amazon sui robot EUREKA J15 Ultr...
Chrome disattiverà automaticament...
Tornano tutti e 4 i colori disponibili p...
Super sconto su iPhone 16: Amazon abbass...
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: 18:03.


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