Newsgroup: it.comp.lang.c++
Titolo: dimensione dei tipi

Salve,
sto lavorando sotto DOS con il DJGPP e mi sono imbattuto di uno strano
"errore" (lo metto tra vergolette perché è probabile che l'errore lo
stia commettendo io)
So che il djgpp alloca
2 byte per uno short int
4 byte per un int
(se faccio sizeof(short int); ottengo 2 e con sizeof(int); ottengo 4)
perchè allora se creo una struttura del tipo
struct my_struct
{
 short  uno;
 int    due;
};
int main()
{
 my_struct A;
 cout << sizeof(A) << endl; 
 return 0;
}
ottengo come risultato 8, quando invece dovrei avere 6?
Se pero' creo una struttura del tipo
struct my_struct
{
 short  uno;
 short  due;
};
la sua dimensione è 4 ... O__o
Spero che qualcuno riesca a chiarirmi le idee...
è un mio errore o è un bug del DJGPP?

ottengo come risultato 8, quando invece dovrei avere 6?
E' tutto allineato a 4 byte per velocità. I due byte 'in più' sono
persi...
PS: è meglio definire due int...
Luc.


ma due int non vanno bene...
ti spiego, sto creando una librearia per memorizzare lo header di un
BMP...
in totale ho bisogno di 54 byte ... con quei due byte in piu' ottengo
un header di 56 byte con dei risultati disastrosi...
mi devo rassegnare? O__o
o forse basta dividere la struttura in piu' strutture?

o forse basta dividere la struttura in piu' strutture?
O leggere campo per campo.
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

Il bit-padding e' tipico per le strutture.
Probabilmente è la soluzione giusta...
qualcuno mi ha consigliato di usare i #pragma,
ma sinceramente non so cosa ne cosa siano, ne come si usino!
Qui c'è sempre piu' buio ;)

un header di 56 byte con dei risultati disastrosi...
E' strano, ho fatto anche io la stessa cosa su un vecchio programma e
non mi dava nessun problema, ma sinceramente non ricordo come lo avevo
implementato, ma sicuramente leggevo la struttura in un colpo solo...
Luc.

 ma sinceramente non so cosa ne cosa siano, ne come si usino!
Per definizione le pragma sono dipendenti dal compilatore. Quindi devi per forza
guardare la documentazione dello stesso. Anche se e' molto probabile che la
pragma che serve a te si chiami align.
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556



Non tutti i compilatori supportano questa opzione anche
dove i problemi di allineamento non sono imposti
dall'hardware (ci sono architetture in cui accedere ad un
dato multibyte non allineato e' impossibile per la CPU).
L'ultima volta che mi e' capitato di verificare g++
era ad esempio sprovvisto di una tale opzione di packing.
La cosa migliore e' scrivere codice che non soffre
dei problemi di padding. Se ad esempio bisogna leggere
o scrivere dei file dal formato assegnato e' meglio
evitare di fare fread/fwrite di strutture ma fare
invece delle letture membro-a-membro... facendo se
possibile in modo da centralizzare anche la
dipendenza dall'endian-ness del sistema e dalla
dimensione degli interi. In fondo costa poco.
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

Esempio valido per VC++ in Win32 Console Application
ma forse va bene anche per te
con #pragma pack[1] allinei al byte, cioč non allinei.
#include <stdio.h>
#pragma pack(1)
void main()
{
  struct
  {
    short s;
    int i;
  } x;
  printf("Dimensione di x = %i\n", sizeof(x));
  return;
}
La dimensione č 6, senza #pragma č 8.
-------------------------------------------
Programmare in C< con WinDOS 1.0 (freeware)
Su richiesta 683 K attaccati ad un e-mail.