Porre a zero i valori contenuti dall'area di memoria puntata da un Puntatore
Per porre a zero uno o più valori contenuti dall'area di memoria allocata puntata da un Puntatore, si potranno adottare almeno tre modalità.
Uso dei Memory Stream
Come sappiamo la risorsa Memory Stream consente di scrivere nell'area di memoria riservata puntata da una variabile di tipo Puntatore. Potremo così agevolmente azzerare i valori, che desideriamo, presenti in tale area.
Mostriamo un semplice esempio, nel quale prima scriveremo alcuni valori superiori a zero nell'area preliminarmente allocata, poi ne azzereremo alcuni mediante gli Stream:
Public Sub Main() Dim p As Pointer Dim st As Stream Dim b As Byte Dim i as Integer ' Allochiamo una porzione di memoria per il nostro esempio: p = Alloc(SizeOf(gb.Byte), 8) st = Memory p For Write ' Scriviamo otto valori superiori allo zero nell'area di memoria puntata dal Puntatore: For b = 1 to 8 write #st, b As Byte Next ' Vediamo in console il risultato: For i = 0 To 7 Print Byte@(p + i) Next ' Ora azzeriamo quattro valori di seguito cominciando dal byte di indice 2: Seek #st, 2 For b = 1 to 4 write #st, 0 As Byte Next ' Torniamo a vedere in console il risultato: For i = 0 To 7 Print Byte@(p + i) Next st.Close Free(p) End
Uso della funzione esterna bzero() della libreria di C
Questa modalità prevede l'uso della funzione esterna bzero() della libreria di C.
Mostriamo un esempio analogo al precedente:
' void bzero (void *__s, size_t __n) ' Set N bytes of S to 0. Private Extern bzero(__s As Pointer, __n As Integer) In "libc:6" Public Sub Main() Dim p As Pointer Dim st As Stream Dim b As Byte Dim i As Integer p = Alloc(8) st = Memory p For Write ' Scriviamo otto valori superiori allo zero nell'area di memoria puntata dal Puntatore: For b = 1 to 8 write #st, b As Byte Next ' Vediamo in console il risultato: For i = 0 To 7 Print Byte@(p + i) Next Print ' Ora azzeriamo quattro valori di seguito cominciando dal byte di indice 2: bzero(p + 2, 4) ' Torniamo a vedere in console il risultato: For i = 0 To 7 Print Byte@(p + i) Next st.Close Free(p) End
Uso della funzione esterna memset() della libreria di C
Si può utilizzare anche la funzione esterna memset() della libreria di C.
' void *memset(void *str, int c, size_t n) ' Copies the character c (an unsigned char) to the first n characters of the string pointed to, by the argument str. Private Extern memset(s As Pointer, c As Integer, n As Long) In "libc:6" Public Sub Main() Dim p As Pointer Dim st As Stream Dim b As Byte Dim i As Integer p = Alloc(SizeOf(gb.Byte), 8) st = Memory p For Write For b = 1 To 8 Write #st, b As Byte Next For i = 0 To 7 Print Byte@(p + i) Next ' Ora azzeriamo tutti i valori del vettore: memset(p, 0, 8) ' Vediamo in console il risultato: For i = 0 To 7 Print Byte@(p + i) Next st.Close Free(p) End
Quest'altro esempio è effettuato su una variabile vettoriale agendo attraverso la sua proprietà .Data, che restituisce un Puntatore che punta all'area di memoria ove sono immagazzinati i valori del vettore medesimo:
' void *memset(void *str, int c, size_t n) ' Copies the character c (an unsigned char) to the first n characters of the string pointed to, by the argument str. Private Extern memset(s As Pointer, c As Integer, n As Long) In "libc:6" Public Sub Main() Dim bb As Byte[] = [1, 2, 3, 4, 5, 6, 7, 8] Dim b As Byte ' Ora azzeriamo tutti i valori del vettore: memset(bb.Data, 0, 8) ' Vediamo in console il risultato: For Each b In bb Print b Next End