Newsgroup: it.comp.lang.c
Titolo: Strano errore allocazione struttura e fscanf

Ciao a tutti,
premetto che ho scritto questa domanda anche su
it.comp.programmare.win32 in quanto programmo su Windows ma in realta'
non so se il mio errore e' legato alla piattaforma.
Vorrei avere delucidazioni su uno strano errore che mi capita in 3
linee di codice dopo una banale modifica:
Ho una struttura cosi' definita:
typedef struct tagRecordInfo
{
char Field[24];
char Type[4];
int Size;
int Pos;
} RecordInfo;
Codice funzionante:
RecordInfo ri[128];
int numfields=0;
while (fscanf(file,"%s %s %d
%d",ri[numfields].Field,ri[numfields].Type,&ri[numfields].Size,&ri[numfields].Pos)!=EOF)
	numfields++;
Ovviamente supponiamo numfields<128.
Ora modifico la dichiarazione di ri:
RecordInfo *ri;
ri=new RecordInfo[128];
int numfields=0;
while (fscanf(file,"%s %s %d
%d",ri[numfields].Field,ri[numfields].Type,&ri[numfields].Size,&ri[numfields].Pos)!=EOF)
	numfields++;
Quando il file finisce, indipendentemente dal valore di numfields
(sempre <128) e dalla dimensione di ri in debug CodeGuard (lo uso
insieme al BC 5.02a) mi rileva un access overrun sulla linea della
fscanf all'interno dell'area heap allocata etc etc.
Insomma con l'allocazione dinamica ottengo uno "svaccamento"
(passatemi il termine poco tecnico) della fscanf ma non capisco
perche' in quanto per me le due dichiarazioni sono equivalenti.
Avete suggerimenti ?
Ciao
Stefano
Stefano "HappyMan" (Lago Maggiore - NO)
--
http://www.sgr.info
Email happyman69 (at) 
libero.it

%d",ri[numfields].Field,ri[numfields].Type,&ri[numfields].Size,&ri[numfields].Pos)!=EOF)
Non è la stessa cosa perche se usi un'array allocato automaticamente, la
sintassi della fscanf va bene; nel caso di un puntatore la sintassi dovrebbe
essere:
   *(ri + numfields).Field
perchè nel caso di puntatori ri contiene l'indirizzo della struttura e non
la struttura stessa!
Prova e fammi sapere
--------------------------------
Inviato via 
http://usenet.libero.it

   *(ri + numfields).Field
E` del tutto equivalente a 
  r[i].Field
-- 
Andrea Laforgia
#exclude <windows.h>

    *(ri + numfields).Field
sono due notazioni IDENTICHE.. la tua poco.. leggibile imho.. de gustibus
cmq
#include <stdio.h>
int main(int argc, char* argv[])
{
        char a[]="0123456789";
        int i;
        for (i=0;i!=10;i++)
        {
                printf("a[%d]  = %c\r\n",i, a[i]   );
                printf("%d[a]  = %c\r\n",i, i[a]   );
                printf("0[a+%d]= %c\r\n",i, 0[i+a] );
                printf("*(a+%d)= %c\r\n\r\n",i, *(a+i) );
        }
        return 0;
}
Uno sbirish e l'obfuscated c

 Uno sbirish e l'obfuscated c
Umh, ne aggiungo una alla tua lista:
(a+i)[0]
Tommy

*(rc + i).Field non č la stessa di rc[i].Field...
 dovrebbe essere *(rc[i]).Field, perchč se si vuole usare l'operatore di
accesso diretto si deve fare cosě!!


Scusate ho preso una svista!


accesso diretto si deve fare cosě!!
Il fatto e' che se fosse errata la scrittura dovrei avere un errore di
overrun alla prima esecuzione della fscanf, non dopo aver letto n
righe senza intoppi e arrivo alla fine del file...


righe senza intoppi e arrivo alla fine del file...
Hai provato a usare fgets(), al posto di fscanf() e compiere un
parsing manuale ?


parsing manuale ?
No, ma e' ovvio che se tutte le operazioni le faccio a mano (leggere i
dati e copiarli nella struttura) non avro' problemi...:-)
Mi sarebbe piaciuto capire il motivo per cui la _fscanf_ si
incasina...
Ci sono altre strade per la soluzione (uso di WriteFile in scrittura e
ReadFile in lettura, indicando prima del blocco dati la dimensione
della struttura stessa) ma mi resta la curiosita' di quello che inizio
a pensare sia un baco della fscanf  del Borland 5.02a
