Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
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
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, 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
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, 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
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, 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


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Boeing CST-100 Starliner: la NASA rende ...
hiop e TaDa uniscono le forze per trasfo...
Thermal Grizzly mostra il Ryzen 7 9850X3...
AMD Ryzen 'Olympic Ridge' Zen 6 per desk...
Donald Trump renderà pubbliche in...
Prezzo mai visto da mesi: ECOVACS DEEBOT...
Non solo S26, Samsung sta per lanciare a...
Windows 11 avrà a breve uno Speed...
Ask Intel: l'assistente IA che ti aiuta ...
Nasce Freedom.gov: il portale USA per ag...
Bose QuietComfort SC a 179,95€: ANC legg...
Attenzione ai conti: confermata falla sf...
30.000 Pa e lavaggio a 100°C: DREAME...
Nioh 3 vola oltre 1 milione di copie, la...
AMD Radeon RX 9060 XT: staccato (di molt...
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:15.


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