Newsgroup: it.comp.lang.c
Titolo: Spiegazioni....

Avrei un piccolo quesito da esporvi sperando di poter ricevere da voi
una qualche spiegazione in merito...
Per motivi personali ho creato degli archivi contenenti delle quantità
di dati per facilitarmi un lavoro che debbo fare nel mese di
settembre.
Gli archivi hanno una dimensione variabile dal più piccolo che si
aggira intorno ai 4kb al più grande che ha una dimensione di circa
219megabyte contenente 5 campi da 1 byte per 63.000.000 di record (se
così li si potrebbero chiamare).
Per velocizzare la ricerca di queste informazioni ho salvato in altri
file una tabella di puntatori far contenenti l'offset assoluto di
alcuni di questi record per velocizzare il processo di ricerca... che
deve essere ripetuto per 40 volte alla settimana... (ok... c'e' un
tipo che ha una sua idea su un metodo del lotto e io gli sto
automatizzando la procedura di calcolo...). Fin qui nessun problema se
non fosse che la prima volta che eseguirò tale programma dovrà
eseguire una quantità spaventosa di letture (20x1500 volte leggere il
file da 200 e passa megabyte !).
Oggi, mi era stato chiesto di integrare uno di questi archivi in
un'altro sistema.
So di aver commesso parecchi errori nel scrivere il codice, di cui ora
mi rendo conto.
Il nocciolo della questione pultroppo è un'altro.
Dovendo leggere 88 puntatori far per memorizzzarli in una tabella di
tipo unsigned long ho usato un procedimento di cui non sono pienamente
convinto.
unsigned char buffer[256];
unsigned long ptr[88];
for (i=0; i < 88; i++)
{
/* Leggo le informazioni dall'archivio e occupano i primi 4 byte del
buffer */
/* Converto i dati del buffer in puntatori... */
ptr[i]=(buffer[0])+(buffer[1]*256)+(buffer[2]*65536) /* Il 4 byte in
questo ciclo risulta sempre azzerato.... */
};
So che forse questo non è il modo più corretto per creare un intero da
32bit partendo da 3 byte.
Il compilatore che sto ad usare è il Turbo C++ 3.0 x Dos.
Analizzando con il debugger i valori della struttura ptr sono tutti a
posto... tranne il n. 4, 5 e 6 che nonostante tutti i calcoli
dovrebbero dare numeri inferiori a 60.000 risultano stranamente tutti
oltre i 4.270.000.000.
Eppure due numeri che sono inferiori a 180 moltiplicati tra di loro
non possono dare una cifra superiore a 32.000 (ho provato pure con la
calcolatrice! e nessun errore... il buffer conteneva i valori da me
previsti e tutti i risultati danno i numeri esatti... ma qui siamo
nell'assurdo)
Che cosa ha avuto il compilatore ??? Se questo è solo l'inizio non oso
pensare quando dovrò utilizzare quell'archivio di 219mega... perchè se
incominciamo così io me ne ritorno da dove sono venuto... e codifico
il programma in linguaggio assembly x 386 e non avrò di questi
problemi!
Che gli è preso a quello scemo ??? Immagino che sul manuale non ci
siano errori del tipo: Il compilatore si è rincoglionito....
Ringrazio in anticipo chiunque mi sappia dire qualcosa...

 nell'assurdo)
Non potresti fornirci anche i valori presenti nel buffer? Cosi' e' un
po' difficile darti una risposta.
Inoltre non capisco il tuo discorso sulla moltiplicazione di due numeri
inferiori a 180: mi sembra che stai facendo moltiplicazioni fra numeri
ben maggiori.
Un saluto
  Lucio
--
(
  Lucio Benfante
 
http://www.dei.unipd.it/~benfante
                                          )
Sent via Deja.com 
http://www.deja.com/
Share what you know. Learn what you don't.