Ora, nella giusta filosofia hacker tali puntatori vengono usati per scrivere e leggere in altre “funzioni” di Gambas aventi comunque loro precipue modalità?
Per quel che riguarda il C l'uso dei
Puntatori nei codici, scritti in questo linguaggio, è estremamente frequente. A volte vi sono funzioni che richiedono, come parametri, proprio dei
Puntatori; e moltre volte ritornano un
Puntatore.
...ma come si fa a
leggere o a
scrivere in un'area riservata, puntata da una variabile di tipo
Puntatore ? Gambas usa uno stratagemma, rappresentato dai "
Memory Stream".
Ad esempio per scrivere in un
Puntatore (
rectius: all'interno di un'area puntata da un
Puntatore), dopo aver generato una variabile di tipo
Stream dal
Puntatore, si utilizza questa variabile per scriverci dentro. Fatto ciò, però, alla funzione esterna, che pretende che sia passato come argomento un
Puntatore, si passerà la varibile di tipo
Puntatore e
non la variabile Stream (da essa generata e da noi utilizzata per scrivere nell'area riservata di memoria).
Insomma, va tenuto a mente che sostanzialmente il
Puntatore punta ad un'
area riservata di memoria, nella quale -
con Gambas - è possibile leggere o scrivere mediante i
Memory Stream.
Un'area riservata di memoria può essere definita con la funzione:
alloc(), e vi si potrà - ad esempio - scrivere secondo questa procedura astratta:
Public Sub Main()
Dim p As Pointer
Dim st As Stream
' Riserviamo un'area di memoria di 64 byte, il cui indirizzo è puntato dalla variabile "p":
p = Alloc(64)
' Generiamo dalla variabile "Puntatore" una variabile di tipo "Stream", ad esempio per scrivere nell'area riservata:
st = Memory p For Write
' Scriviamo dunque dentro l'area riservata di memoria, come se agissimo in un File:
Write #st, "Gambas\x0AGambas"
' Chiudiamo il flusso:
st.Close
' Qui, ad esempio, passiamo il puntatore alla funzione esterna che richiede come argomento un Puntatore
' ad un'area di memoria riservata, nella quale sia stata scritta la stringa di cui sopra:
Funzione_Esterna(p)
' Poiché abbiamo allocato 64 byte di memoria, ora, che non serve più, la liberiamo:
Free(p)
End
Per generare, invece, un
Puntatore da un altro tipo di variabile (quindi per creare un
Puntatore che punta all'indirizzo di memoria di una variabile), si fa uso della funzione:
VarPtr() .
Più in generale i
Puntatori ci consentono, anche in Gambas, di
operare all'interno di un'area di memoria, allocata da noi oppure allocata da un'altra risorsa. Vediamo al riguardo questo semplice esempio.
Leggiamo e cambiamo un carattere di una stringa contenuta in una variabile di tipo
Stringa:
Public Sub Main()
Dim p As Pointer
Dim st As Stream
Dim s As String
Dim j, b As Byte
' Assegnamo del testo alla variabile di tipo "String":
s = "gambas"
' Assegnamo l'indirizzo di memoria della variabile "s" ad una variabile di tipo Puntatore:
p = VarPtr(s)
' Generiamo dalla variabile "Puntatore" una variabile di tipo "Stream" in lettura ed in scrittura:
st = Memory p For Read Write
' Andiamo a vedere mediante la variabile di tipo "Stream" i valori presenti all'interno
' dell'area di memoria della variabile "s", puntata dal puntatore:
For j = 0 To String.Len(s) - 1
Read #st, b
Print Hex(b), b, Chr(b)
Next
' Scriviamo ora un valore (ad esempio il carattere di "fine riga a capo") nel quarto byte
' (di indice 3) dell'area di memoria puntata dalla variabile "s", a sua volta puntata dal puntatore:
Seek #st, 3
Write #st, &0A As Byte
' Chiudiamo il flusso:
st.Close
' ...vediamo direttamente dalla variabile stringa "s" la modifica apportata:
Print s
End