Newsgroup: it.comp.lang.c
Titolo: Ma la sizeof() sa contare????

Ciao a tutti,
vi pongo un tremenndo quesito.....
Ieri mentre stavo facendo un veloce programmino per leggere dei file (in
formato binario), stavo costruendo
delle struct che potessero facilitarmi il mio lavoro......ma ho avuto dei
decisi problemi!!!
Ecco un bel esempio da studiare:
#include <stdio.h>
struct mia {
   unsigned short a;
   unsigned short b;
   char primo;
   char secondo[2];
   char terzo[2];
};
main(void)
{
    printf("sizeof(struct mia) = %d\n", sizeof(struct mia));
}
Ecco tutto..... Dove sta il problema?? Il fatto che il programma così
compilato sotto Linux stampa a video
un sizeof() = 10 bytes, ma io che penso di saper contare ho costruito un
struttura di 9 bytes!!!!
Ma allora 2+2+1+2+2 fa 9 o 10 ????? Secondo voi??
Qualcuno sa come mai si verifica tutto ciò??? Ma soprattutto esiste un
sistema, come opzioni di compilazione, od altro che mi permetta di ottenere
un sizeof() corretto???
PS: Non mi è assolutamente possibile fare a meno di utilizzare struct non
allineate in quanto i file che andrò a leggere sono costituiti da record
binari di lunghezza in bites dispari...... Inoltre vi garantisco che
costruito anche struct di 53 byte che mi sono state ridefinite da
compilatore a 60 byte!!!
Vi prego.... Aiutatemi.
Luca Landi

 un sizeof() corretto???
   La dimensione di una struttura non e` pari alla somma delle 
dimensioni degli oggetti che la compongono: ad esse vanno sommati i 
/padding/ per l'allineamento in memoria, dipendenti dalla piattaforma in 
cui si opera.
--
Alla prossima,
Marco

 Qualcuno sa come mai si verifica tutto ciň??? Ma soprattutto esiste un


 cut
Puoi mettere come primo campo della tua struttura un ulteriore campo size
dove specifichi la sua ampiezza in bytes.
Maurus

Purtropp se la struttura dati ti č imposta da standard provenienti da terze
parti, non c'č molto da fare.
Nel mio caso dovevo ad esempio leggere dei file di borsa prodotti da
Metastock Pro 7 e non penso di poter imporre alla Equis (la software house)
di modificare un suo standard oramai utilizzato da almeto 5 o piů
anni......(perň sarebbel bello....)
Altro caso in un nota compagnia di Telefonia Mobile rivale della Tim,
esistono dei file importantissimi e di dimensioni che si misurano a Gigabyte
con storici di anni che sono prodotti su macchine Digital a 64 bit e che in
futuro dovranno essere anche letti da PC o macchine Sun a 32 bit....il tutto
mantenendo logicamente lo standard attuale....
Insomma, grazie per suggerimento, ma come vedi a volte la soluzione non č
proprio dietro l'angolo.
Se comunque ti interessa una soluzione piů precisa puoi vedere il mio post
precedente...
Ciao,
Luca
"Maurus" <REMOVE...@rocketmail.com-REMOVE> wrote in message
news:9iugka$l0e$1...@newstoo.ericsson.se...


mantenendo logicamente lo standard attuale....
Come notizia ti posso dire che un mio amico ha lavorato
su una macchina in cui gli interi sono 64 bit.
Anche i long sono 64 bit. E anche i short (!).
Pensi che sia impossibile riuscire a leggere un file dati
che contiene coordinate salvate con short a 16 bit ?
E' possibilissimo, e neanche difficile... basta non
pretendere di farlo con una fread di una struttura.
Nota anche che fare fread di strutture non e' nemmeno
detto che sia la cosa piu' performante.
Io ti consiglio di farti delle funzioni del tipo ...
  void GetInt(FILE *f,int *v);
  void GetCharBuf(FILE *f,char *b,int size);
  void GetCString(FILE *f,char **s);
  void GetDouble(FILE *f,double *d);
  void PutInt(FILE *f,int v);
  void PutCharBuf(FILE *f,char *b,int size);
  void PutCString(FILE *f,char *s);
  void PutDouble(FILE *f,double v);
Anzi... io consiglierei di non usare un FILE * ma un
tuo oggetto di "serial stream". In questo modo potresti
anche usare lo stesso codice per salvare su disco o
inviare via rete o salvare in formato compresso.
Usare delle funzioni che leggono/scrivono a livello
di singolo campo *conoscendone il tipo* ti permettono
di risolvere in un posto solo problemi come il formato
big/little endian o del set di caratteri.
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 windows compilandolo con il Visual C???
W il formato testo! :-))
Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

file scambiati.... (che non sono stati progettati per il porting...).
Difatti e' sbagliato generare delle informazioni binarie, se
si punta alla portabilita'.  Il modo piu' portabile per
scambiare dati e' quello di generare file di testo.
--
CyberWalkie - walkietalkie(at)
libero.it