Scrivere nell'area di memoria puntata da un Puntatore

Da Gambas-it.org - Wikipedia.

Come sappiamo, i Puntatori ci consentono, anche in Gambas, di operare all'interno di un'area di memoria allocata.

Uso dei Memory Stream

In particolare, in Gambas non è possibile scrivere i dati direttamente nella variabile di tipo Puntatore, ma si deve far uso della risorsa degli Stream.

La procedura al riguardo prevede la creazione di un flusso di dati mediante la risorsa dei Memory Stream. Tale flusso viene gestito con un particolare tipo di variabile chiamato appunto Stream, nel quale si effettuerà la scrittura dei dati (come sappiamo è possibile anche la lettura di dati da un Puntatore). il Puntatore medesimo (ad esempio ad una funzione esterna verrà passato il Puntatore, referenziato, e non la variabile di tipo Stream utilizzata per la scrittura !

Va precisato che la risorsa degli Stream va utilizzata esclusivamente per scrivere (e volendo anche per leggere) in un "Puntatore", ma fatto ciò dovrà continuarsi ad usare

Mostriamo di seguito un semplice esempio:

Public Sub Main()

 Dim p As Pointer
 Dim st As Stream
 Dim b As Byte
 
' Con la funzione "Alloc()" allochiamo - ad esempio - 8 byte di memoria, che sarà puntata da un "Puntatore":
 p = Alloc(SizeOf(gb.Byte), 8)

' Con la risorsa "Memory Stream" generiamo una variabile di tipo "Stream", che ci consentirà di scrivere nell'area di memoria riservata puntata dal "Puntatore":
 st = Memory p For Write

' Scriviamo a titolo esemplificativo alcuni dati nell'area di memoria riservata:
 For b = 1 To 8
    Write #st, b * 10 As Byte
 Next

' Verifica il risultato in console:
 For b = 0 To 7
   Print Byte@(p + CInt(b))
 Next

' In fine viene chiuso il flusso "Stream":
 st.Close

' Libera la memoria precedentemente allocata:
 Free(p)

End


Uso della funzione esterna di C memset()

Per scrivere nell'area di memoria riservata puntata da una variabile di tipo Puntatore, volendo, è possibile utilizzare anche la funzione esterna del linguaggio C memset().

Mostriamo un semplice esempio:

Library "libc:6"

' void *memset (void *__s, int __c, size_t __n)
' Set N bytes of S to C.
Private Extern memset(s As Pointer, c As Integer, n As Long)


Public Sub Main()

 Dim p As Pointer
 Dim b As Byte
 
  p = Alloc(8)  
  
' Scrive nell'area di memoria puntata dal "Puntatore":
  For b = 0 To 7
    memset(p + CInt(b), (b + 1) * 10, 1)
  Next
  
' Verifica il risultato in console:
  For b = 0 To 7
    Print Byte@(p + CInt(b))
  Next
  
' Libera la memoria precedentemente allocata:
  Free(p)
  
End