Passare un`area riservata di memoria ad una funzione esterna
Qualora una funzione esterna preveda che le si passi una Struttura, o comunque un'altra area allocata di memoria, per mezzo di un puntatore a questa Struttura, affinché questa venga riempita dalla funzione medesima magari con due o più valori, che possono essere anche di tipo diverso; e che successivamente si debba procedere alla dereferenziazione, procederemo nel modo seguente:
1) allocheremo una sufficiente quantità di memoria, che sarà puntata da una variabile di tipo puntatore;
2) passeremo tale puntatore alla funzione esterna che provvederà a riempirla;
3) procederemo alla dereferenziazione. Se il valore restituito dalla funzione esterna è unico, ossia il suo indirizzo coincide con la struttura (o classe) stessa, e dunque o coincide con la parte iniziale dell'area, allora potranno essere utilizzate le consuete funzioni di dereferenziazione (Byte@(), Int@(), etc). Se invece I valori passati dalla funzione esterna sono più di uno, essi occuperanno in modo coerente con il tipo di valore, rappresentato da ciascuno, l'area di memoria da noi riservata e puntata dalla variabile puntatore, e andranno dereferenziati mediante l'uso dei Memory-Stream.
Vediamo un esempio:
Private p As Pointer ' Dichiariamo la funzione esterna dalla quale riceveremo il puntatore alla "Struttura" esterna: Private Extern funzione_esterna(pEst As Pointer) Public Sub Button1_Click() Dim ms As Stream Dim by As Byte ' Ci riserviamo un'area sufficiente di memoria: p = Alloc(quantità_di memoria_da_allocare) ' Passiamo alla funzione esterna il puntatore all'area allocata, ' affinché essa gli assegni il valore dell'indirizzo di memoria puntato: funzione_esterna(p) ' Andiamo a dereferenziare il pointer: ms = Memory p For Read ' Andiamo a leggere e mostrare in console i dati: While Not Eof(ms) Read #pS, by Print by Wend End Public Sub Form_Close() ' In fase di chiusura del programma, si procederà anche a "de-allocare", ' cioè a liberare, la porzione di memoria precedentemente allocata: Free(p) End