Passare un`area riservata di memoria ad una funzione esterna

Da Gambas-it.org - Wikipedia.

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:
   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