Newsgroup: it.comp.lang.c
Titolo: problema credo dovuto a memoria e puntatori

Ciao a tutti!
Sto facendo un motore 2D in C sotto DOS nella modalita 320x200, utilizzando 
il Borland C++ 3.1
La cosa sta procedendo abbastanza bene, se non fosse per un problema sul 
quale sto scimunendo da parecchio tempo perchè anche se ho capito +- da cosa 
è dovuto non riesco a capire il perchè mi s presenta questo errore!!!
Questo link vi permette di scaricare un *.rar contenente l'intero motore 
scritto in C, il file eseguibile DEMO.exe che lo sfrutta, ed alcune immagini 
grazie alle quali potrete osservare il problema:
http://minto.altervista.org/DEMO.rar
Cerco di illustrarvi il problema:
Prima di leggere il problema però vi prego di aprire il file DEMO.cpp 
(potete aprirlo anche col blocco note) dare una veloce occhiata e poi 
eseguire DEMO.exe(ogni volta che vi sembra che l'esecuzione si ferma premete 
un tasto, ci sono dei getch() in mezzo...), altrimenti credo che non 
capirete un bel niente e sarete mooooooolto confusi.
La parte importante in cui si presenta l'anomalia dell'esecuzione di 
DEMO.exe e questa:
DEMO.exe Carica l'immagine parco.bmp in un puntatore sprite1.data.
Scompone l'immagine appena caricata in tiles (mattonelle, in pratica 
scompone l'immagine in quadrati di 20x20 pixel, eliminando i tile 
ridondanti, ovvero uno stesso quadrato se è presente più volte nell'immagine 
lo prende una sola volta) utilizzando la funzione ScomponiLivelloInTiles.
Faccio uno scrool a schermo di tutta l'immagine sfruttando i tile appena 
ottenuti.
Carica una nuova immagine a video ed esegue un ANIMAZIONE.
Poi fa altre cose di minore interesse...
Il problema è che asseconda del file associato a parco.bmp l'esecuzione si 
comporta in modo differente (provare per credere: ho allegato diverse 
immagini nominate parco.bmp, 1.bmp, 2.bmp,... (tutte alte 200pixel, la 
larghezza invece varia) rinominatele una alla volta in parco.bmp e osservate 
cosa succede lanciando DEMO.exe). In pratica noterete che non sempre 
l'ANIMAZIONE viene eseguita in modo corretto!
Il problema sono sicuro al 99% che è dovuto ad un utilizzo improprio della 
memoria, ed ho individuato nella dichiarazione del puntatore 
ptrDoubleBuffering una possibile sorgente di errore:
//lo ho dichiaratato:
byte huge *ptrDoubleBuffering;
//quindi gli ho allocato la memoria
ptrDoubleBuffering=(byte huge *)farmalloc(360*200);
if (ptrDoubleBuffering==NULL) {
 printf("\nERRORE: impossibile assegnare questo spazio di memoria a 
ptrDoubleBuffering");
 getch();
 exit(1);
}
//lo utilizzo nello scrool dell'immagine, scomposta in tile, a video.
...
//libero lo spazio di memoria prima assegnatogli, visto che non mi serve più
farfree(ptrDoubleBuffering);
Il problema come per magia viene risolto se dichiaro ptrDoubleBuffering 
omettendo huge, e apportando i dovuti accorgimenti (salvo poi il presentarsi 
di altri problemi dovuti all'accesso a locazioni di memoria non allocate):
//lo ho dichiaratato:
byte *ptrDoubleBuffering;
//quindi gli ho allocato la memoria
ptrDoubleBuffering=(byte *)malloc(320*200);
if (ptrDoubleBuffering==NULL) {
 printf("\nERRORE: impossibile assegnare questo spazio di memoria a 
ptrDoubleBuffering");
 getch();
 exit(1);
}
//lo utilizzo nello scrool dell'immagine, scomposta in tile, a video.
...
//libero lo spazio di memoria prima assegnatogli, visto che non mi serve più
free(ptrDoubleBuffering);
Direte voi di utilizzare allora la versione senza huge! Io la utilizzerei 
molto volentieri, se non fosse che a me serve una locazione di memoria 
avente 72000 celle (360*200), e non 320*200 (64000). Con i normali puntatori 
posso accedere solo alle prime 64xxx celle (non ricordo di preciso, comunque 
il contenuto massimo di un int), con huge, invece risolvo questo problema!
(Huge lo utilizzo inoltre nel caricamento delle immagini *.bmp e *.pcx senza 
problemi!)
Quale può essere allora il problema???
Il file *.cpp è abbastanza lungo, e chiedervi di comprenderlo tutto sarebbe 
troppo, potete però dare un occhiata al main ed alle funzioni princiapali 
che sono comunque brevi, almeno quelle in cui uso ptrDoubleBuffering, in 
particolare modo copiaBuffer, stampaTileBuffer, che dovrebbero causare 
l'errore, almeno a quanto sono riuscito a capire...
ed a queste, che invece vengono utlizzate nella creazione dell'ANIMAZIONE
copySprite, getBitmap, drawBitmap.
hauhuaua ho fatto un tema!
Ma sto problema lo trovo talmente assurdo che è anche difficile da spiegare!
A presto CIAO!
PS: si sono ancora al 320x200x256, ma da qualcosa dovevo pur iniziare, e più 
che utilizzare librerie di altri ho preferito fare qualcosa di mio! 

Ok raga ho risolto!
Era un errore banale nel main...
CYA