Newsgroup: it.comp.lang.c
Titolo: Strano problema con C++ builder 3

Sto rispolverando le mie arrugginite conoscenze di C con l'uso del 
C++ Builder in versione 3. Mi sto prodigando per realizzare un 
map-editor per il vecchio DOOM2 ma incappo in un problema (che cmq ho
risolto) nella lettura del file WAD. In pratica utilizzando la 
sintassi di fopen, fread, etc... al posto di open, read, succede che 
la lista del contenuto del WAD (il file di DOOM2 che contiene le 
risorse del gioco stesso) mi salta un byte dopo una 50ina di record, 
shiftando quindi il contenuto dei record seguenti. Tale scherzo lo fa
sempre, anche su macchine diverse, negli stessi punti della lista e 
ho notato che lo fa diverse volte in tutta la lista. Mi sembra 
assurdo. Sto sbagliando qualche cosa???
--- PARTE COMUNE ----
|// Dichiarazioni variabili globali
|
|// Un Lump è un record che contiene il nome di una risorsa di DOOM
|// che può essere uno sprite, un suono, etc..., l'inizio della 
|// risorsa all'interno del WAD e la sua lunghezza
|
|struct LumpRecord {
|  long int Start;
|  long int Size;
|  char Name[8];
|};
|
|
|// L'header del WAD contiene il numero di Lump presenti e l'inizio
|// nel WAD della lista dei Lump, che è consecutiva
|
|struct HeaderRecord {
|  char Signature[4];
|  long int Lumps;
|  long int StartDir;
|};
| 
|HeaderRecord Header;
|HeaderRecord *PtrHeader;
|LumpRecord Lump[10000];
|LumpRecord *PtrLump;
|
--- FINE PARTE COMUNE ----
--- Sintassi con open, funzionante ---
|int Xc;
|int x;
|int y;
|char Dummy[9];
|Xc=open("E:/GIOCHI/DOOM2/DOOM2.WAD", O_BINARY);
|if (Xc==0)
|  return false;
|PtrHeader=&Header;
|x=read(Xc, PtrHeader, sizeof(Header));
|lseek(Xc, Header.StartDir, 0);
|PtrLump=&Lump[0];
|DoomEdit->Lumps->Clear();  // uso un listbox
|if (read(Xc, PtrLump, sizeof(Lump[0])* Header.Lumps)!=0) {
|  Dummy[8]=0;    
|  for (x=0;x<Header.Lumps;x++) {
|    for (y=0;y<8;y++)
|      Dummy[y]=Lump[x].Name[y];
|    DoomEdit->Lumps->Items->Add(Dummy);
|  }
|}
|close(Xc);
|return true;
--- Sintassi con fopen, crea problemi di shift dei record ---
|FILE * Xp;
|int x;
|int y;
|char Dummy[9];
|Xp=fopen("E:/GIOCHI/DOOM2/DOOM2.WAD", "r");
|if (Xp==NULL)
|  return false;
|PtrHeader=&Header;
|fread(PtrHeader, sizeof(Header), 1, Xp);
|fseek(Xp, Header.StartDir, 0);
|PtrLump=&Lump[0];
|DoomEdit->Lumps->Clear();
|if (fread(PtrLump, sizeof(Lump[0]),Header.Lumps,Xp)!=0) {
|  Dummy[8]=0;
|  for (x=0;x<Header.Lumps;x++) {
|    for (y=0;y<8;y++)
|      Dummy[y]=Lump[x].Name[y];
|    DoomEdit->Lumps->Items->Add(Dummy);
|  }
|}
|fclose(Xp);
|return true;
Scusate per i pipe | ma il newsreader mi trimmava il testo togliendo 
l'indentazione.
-- 
News2000 1.5ß Version 
http://socket2000.8m.com

|if (fread(PtrLump, sizeof(Lump[0]),Header.Lumps,Xp)!=0) {
magari poi Header.Lumps é definito in un modo (long int .. non 
potevi scrivere semplicemente long??) mentre qui é richiesto un
unsigned ..
Antonio

 unsigned ..
Ho provato a cambiarlo in unsigned ma è la stessa cosa.
Grazie delle informazioni, in effetti è da poco che uso C seriamente.


Grazie delle informazioni, in effetti č da poco che uso C seriamente.
ora perň mi viene un dubbio ... prova a fare cosě:
fread(puntatore, sizeof(Lumps)*Header.Lumps, 1, fp);
magari non sbaglia .... se sbaglia..... c'č un'anomalia grossa
da qualche parte...
Antonio

 fread(puntatore, sizeof(Lumps)*Header.Lumps, 1, fp);
Ho trovato il guaio, grazie ad un amico in rete:
io ho usato
Xp=fopen("E:/GIOCHI/DOOM2/DOOM2.WAD", "r");
Ma avrei dovuto usare
Xp=fopen("E:/GIOCHI/DOOM2/DOOM2.WAD", "rb");
Perchè leggo il file in modo binario... Diamine, per un po' ho temuto
che il builder fosse buggato!
