PDA

Visualizza la versione completa : [PASCAL] Passaggio puntatore buffer a funzione per lettura di file binari


mondobimbi
24-06-2007, 16:46
mi è costato un mal di testa, devo inviare un file pdf con protocollo http da una procedura scritta in free pascal ed uso questa funzione


var
H : THandle;
size, r : longInt;
buf : pointer;
begin

H := FileOpen(nome_file_da_inviare, fmOpenread);

size := FileSeek(H, 0, fsfromEnd);

buf := getmem(size);

FileSeek(H, 0, fsfromBeginning);

r := FileRead(H, buf^, size);

FileClose(H);

... ok, una volta che lo ho in un buffer lo spedisco tal quale dopo l'header

freemem(buf);
end;


adesso funziona.

il problema è che scrivevo

r := FileRead(H, buf, size);
e non dereferenziavo buf.
La dichiarazione di FileRead è
http://www.freepascal.org/docs-html/rtl/sysutils/fileread.html

Non riesco a capire perchè sbagliavo, nella mia testa FileRead accetta un Pointer.

grazie a chi me lo spiega
ciao
sergio

oregon
24-06-2007, 16:49
Vuoi spiegato perche' sbagliavi anche se lo hai capito da solo ... ? :confused:

mondobimbi
24-06-2007, 16:57
perché ragionava in C .
Alloco memoria in un buffer, che è poi un puntatore ad un char e passo questo buffer alla funzione che legge i dati dal file (nella mia mente devo passare il puntatore), e scrivevo quindi

r := FileRead(H, buf, size);

in realtà va scritta come

r := FileRead(H, buf^, size);
dereferenziando buf.

Quello che non capisco è perché devo mettere buf^ anziché buf ,
tutto qui
ciao
sergio

alka
24-06-2007, 17:09
Originariamente inviato da mondobimbi
Quello che non capisco è perché devo mettere buf^ anziché buf ,

Siccome il prototipo della funzione prevede l'uso della parola chiave var, presumo che un puntatore al valore passato come parametro venga già passato autonomamente dal codice compilato; usando una variabile non deferenziata, suppongo che invece venga passato il puntatore alla locazione che contiene l'indirizzo dei dati, e non i dati effettivi da utilizzare.

Ciao! :ciauz:

mondobimbi
24-06-2007, 17:26
purtroppo la cosa non mi era chiara, infatti ho perso 4 ore (ed emicrania) per venirne a capo.
Probabilmente è qualcosa come l'equivalente dei reference in C++ .

grazie per il chiarimento

alka
24-06-2007, 17:35
Originariamente inviato da mondobimbi
purtroppo la cosa non mi era chiara, infatti ho perso 4 ore (ed emicrania) per venirne a capo.

Preciso che la mia è solo una supposizione, fatta peraltro basandomi sulle informazioni che hai fornito; se mi fossi trovato nella stessa situazione, probabilmente avrei inizialmente sbagliato la scrittura anche io. :fagiano:

Ciao! :ciauz:

Loading