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;
-- 
News2000 1.5ß Version 
http://socket2000.8m.com

 x=read(Xc, PtrHeader, sizeof(Header));
Scusate, ma il newsreader mi ha stroncato tutta l'indentazione...


 Scusate, ma il newsreader mi ha stroncato tutta l'indentazione...
Cavolo, ti ha anche mandato il messaggio sul newsgroup sbagliato! Prova
con it.comp.lang.c .
Ciao,
Nicola

Xp=fopen("E:/GIOCHI/DOOM2/DOOM2.WAD", "r");
Qui mi pare che il flag per la modalità di apertura sia errato, un
file binario dovrebbe essere aperto cosi'
Xp=fopen("E:/GIOCHI/DOOM2/DOOM2.WAD", "rb");
oppure, se decidi di usare gli stream del C++
#include<fstream>
std::ifstream Xp("E:/GIOCHI/DOOM2/DOOM2.WAD",std::ios::binary);
Il Ghenio
---------
// TODO: Place your ass here

 Xp=fopen("E:/GIOCHI/DOOM2/DOOM2.WAD", "rb");
Perbacco! Hai ragione. E' proprio per questo che sbaglia il 
caricamento... Grazie Ghenio! Smack. ;-)
P.S.
Scusate l'involontario post non in tema.


Ciao,
Questo newsgroup si occupa del linguaggio C++ in quanto tale, e non di
aspetti specifici di particolari implementazioni. Per questo non e' il
posto piu' adatto per porre domande specifiche come la tua.
Potresti avere piu' fortuna su uno dei seguenti gruppi:
Per Win32 (95, 98, NT): it.comp.programmare.win32
Per Dos/Win 3.x: it.comp.os.dos
Per Linux:      it.comp.os.linux.development
Per C++Builder: i gruppi borland.public.cppbuilder.*, disponibili sul
                server 
newsgroups.borland.com
 (prevalentemente in
                inglese, ma si puo' postare anche in italiano)
Grazie,
LM, in vece dell'ottimo Nicola Musatti