Newsgroup: it.comp.lang.c
Titolo: DJGPP: Problemi

Ciao a tutti!
Ho qualche problema con djgpp (usato con Win2000).
In particolare con la funzione read() della libreria fcntl.h: quando leggo
uno stream di caratteri, tra cui e' presente 0x0d (cioe' \r, cioe' "carriage
return"), la funzione mi ritorna un valore di caratteri letti decrementato
del numero di volte che ha incontrato \r!!!
Cioe', se leggo un buffer di 100 caratteri, e sono tra questi presenti 22
\r, ad es., read() mi ritorna 78 come numero di caratteri letti!!!
E' un problema riscontrato da altri?
Inoltre, ho dei problemi anche sulle dimensioni delle struct, ad esempio la
struct:
struct pippo{
unsigned short int pluto;
unsigned long int paperino;
unsigned short int topolino;
unsigned char minnie[10];
};
secondo sizeof() ha dimensione 20, invece che 18!!!!
A cosa e' dovuto questo comportamento??
un grazie a tutti coloro che sapranno aiutarmi!
Fulvio
--------------------------------
Inviato via 
http://usenet.libero.it

 secondo sizeof() ha dimensione 20, invece che 18!!!!
È dovuto a motivi di allineamento che si dovrebbero risolvere ottimizzando
il codice in termini di dimensioni.
In altre parole la dimensione della struct non è necessariamente uguale alla
somma delle dimensioni dei singoli elementi. Per poter megli accedere a
questi elementi vengono lasciate delle locazioni di memoria non utilizzate
(pad). Per esempio, nel tuo caso l'uso della memoria dovrebbe essere il
seguente:
    pippo:     2 byte
    pad:        2 byte
    pluto:      4 byte
    topolino: 2 byte
    minnie:   10 byte
Il pad viene usato perché pluto, campo intero, deve essere allineato in modo
tale che il suo inizio si abbia ogni 4 byte (in una locazione di memoria il
cui indirizzo sia divisibile per 4).
Puoi cambiare le cose cambiando l'ordine degli elementi. Se cambi la struct
nel seguente modo:
    struct pippo{
    unsigned short int pluto;
    unsigned short int topolino;
    unsigned long int paperino;
    unsigned char minnie[10];
    };
cioè mettendo in sequenza i due short int, tutti gli elementi verranno
sistemati in sequenza senza vuoti. Però, in questo caso, la dimensione
complessiva sarà sempre 20;  i due byte di pad verranno spostati alla fine
per far sì che la successiva variabile sia sempre double word-aligned.
In altri casi, cambiando l'ordine degli elementi, puoi avere miglioramenti.
Ad esempio, la struct:
    struct pippo{
        short pluto;
        long int paperino;
        short topolino;
        char minnie[8];
    } ;
occupa 20 byte, con 4 byte di pad (2 dopo pluto e 2 alla fine della struct).
Invece la struct:
    struct pippo{
        short pluto;
        short topolino;
        long int paperino;
        char minnie[8];
    } ;
occupa esattamente 16 byte senza alcun pad.
Maurizio.


Grazie per l'aiuto, immaginavo che si trattasse di problemi di
allineamento...


 E' un problema riscontrato da altri?
Non ho mai usato read, ma il tipo di bug mi fa pensare questo: se il file è
aperto in modalità testo, i \r devono essere eliminati; è previsto dal C in
altri casi, infatti per andare a capo in una stringa usi sempre e comunque
\n, e ciò viene tradotto nella sequenza opportuna se il file è di testo,
come lo stdout; inoltre proprio per questo non si usa fseek su file di
testo; infine, le applicazioni Unix (e DJGPP è fatto apposta perché quelle
possano essere compilate su Dos con meno modifiche possibili) non si
aspettano due caratteri anziché 1 per un vai a capo. Se dovesse essere
così(anche nella stringa letta i \r sparirebbero) allora apri il file come
testo, dopodiché penso no problema. Se non va, controlla se puoi aggiornare
il tuo djgpp all'ultima versione(2.03 mi pare) ma vacci dal link per
win2000, perché il djgpp normale non funziona tanto bene su win2000. Ciao
--
Paolo Giarrusso
Per rispondere togliere solo "TOGLIMI" dall'indirizzo, non _spam.

 --
Grazie per la risposta, ma io non opero su file di testo, ma su file audio:
puo' capitare che ci sia un valore che corrisponda al codice per \r, e cioe'
0x0D, e questo genera malfunzionamenti del programma. Comunque il sistema su
cui intendo far girare il programma che sto sviluppando e' Linux, e su
questo funziona tutto bene!!
Cippa Lippa


 \r, ad es., read() mi ritorna 78 come numero di caratteri letti!!!
Forse perche` win usa due caratteri per terminare una riga \n\r, e
leggendo in modo testo questo terminatore viene interpretato come un solo
carattere, quello che in C e` '\n'.
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscali.it