Passare un'area riservata di memoria ad una funzione esterna

Da Gambas-it.org - Wikipedia.
Versione del 16 lug 2012 alle 08:29 di Vuott (Discussione | contributi) (Nuova pagina: 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 r...)

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

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.


Public Sub Button1_Click()

Dim p As Pointer
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 As Pointer)

'  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