Differenze tra le versioni di "Porre a zero i valori contenuti dall'area di memoria puntata da un Puntatore"

Da Gambas-it.org - Wikipedia.
Riga 12: Riga 12:
 
   Dim st As Stream
 
   Dim st As Stream
 
   Dim b As Byte
 
   Dim b As Byte
 +
  Dim i as Integer
 
   
 
   
   p = Alloc(8)
+
<FONT Color=gray>' ''Allochiamo una porzione di memoria per il nostro esempio:''</font>
 +
   p = Alloc(SizeOf(gb.Byte), 8)
 
   
 
   
 
   st = Memory p For Write
 
   st = Memory p For Write
Riga 23: Riga 25:
 
   
 
   
 
  <FONT Color=gray>' ''Vediamo in console il risultato:''</font>
 
  <FONT Color=gray>' ''Vediamo in console il risultato:''</font>
   For b = 1 to 8
+
   For i = 0 To 7
    Print Byte@(p)
+
    Print Byte@(p + i)
    p = p + 1
 
 
   Next
 
   Next
 
   
 
   
Riga 37: Riga 38:
 
   
 
   
 
  <FONT Color=gray>' ''Torniamo a vedere in console il risultato:''</font>
 
  <FONT Color=gray>' ''Torniamo a vedere in console il risultato:''</font>
  p = p - 8
+
   For i = 0 To 7
   For b = 1 to 8
+
    Print Byte@(p + i)
    Print Byte@(p)
 
    p = p + 1
 
 
   Next
 
   Next
+
 
 
   st.Close
 
   st.Close
+
   Free(p)
<FONT Color=gray>' ''Poiché con l'ultimo ciclo l'indicatore dell'indice interno dell'area di memoria puntata da Puntatore è stata spostato di otto byte avanti,''
+
 
' ''per evitare un errore nel tentativo di deallocazione, riportiamo l'indicatore dell'indice interno otto byte indietro, ossia al byte "iniziale" dell'area di memoria:''</font>
 
   Free(p - 8)
 
 
 
  '''End'''
 
  '''End'''
  
Riga 54: Riga 50:
  
 
==Uso della funzione esterna ''bzero()'' della libreria di C==
 
==Uso della funzione esterna ''bzero()'' della libreria di C==
La seconda modalità prevede l'uso della funzione esterna ''bzero()'' della libreria di C.
+
Questa modalità prevede l'uso della funzione esterna ''bzero()'' della libreria di C.
  
  
Riga 60: Riga 56:
 
  <FONT Color=gray>' ''void bzero (void *__s, size_t __n)''
 
  <FONT Color=gray>' ''void bzero (void *__s, size_t __n)''
 
  ' ''Set N bytes of S to 0.''</font>
 
  ' ''Set N bytes of S to 0.''</font>
  Private Extern bzero(sP As Pointer, size As Integer) In "libc:6"
+
  Private Extern bzero(__s As Pointer, __n As Integer) In "libc:6"
 
   
 
   
 
   
 
   
Riga 68: Riga 64:
 
   Dim st As Stream
 
   Dim st As Stream
 
   Dim b As Byte
 
   Dim b As Byte
 +
  Dim i As Integer
 
   
 
   
 
   p = Alloc(8)
 
   p = Alloc(8)
Riga 77: Riga 74:
 
     write #st, b As Byte
 
     write #st, b As Byte
 
   Next
 
   Next
+
 
 
  <FONT Color=gray>' ''Vediamo in console il risultato:''</font>
 
  <FONT Color=gray>' ''Vediamo in console il risultato:''</font>
   For b = 1 to 8
+
   For i = 0 To 7
    Print Byte@(p)
+
    Print Byte@(p + i)
    p = p + 1
 
 
   Next
 
   Next
 
   Print
 
   Print
Riga 87: Riga 83:
 
   
 
   
 
  <FONT Color=gray>' ''Ora azzeriamo quattro valori di seguito cominciando dal byte di indice 2:''</font>
 
  <FONT Color=gray>' ''Ora azzeriamo quattro valori di seguito cominciando dal byte di indice 2:''</font>
  p = p - 8
 
 
   bzero(p + 2, 4)
 
   bzero(p + 2, 4)
 
   
 
   
 
  <FONT Color=gray>' ''Torniamo a vedere in console il risultato:''</font>
 
  <FONT Color=gray>' ''Torniamo a vedere in console il risultato:''</font>
   For b = 1 to 8
+
   For i = 0 To 7
    Print Byte@(p)
+
    Print Byte@(p + i)
    p = p + 1
 
 
   Next
 
   Next
 
   
 
   
 
   st.Close
 
   st.Close
+
   Free(p)
<FONT Color=gray>' ''Poiché con l'ultimo ciclo l'indicatore dell'indice interno dell'area di memoria puntata da Puntatore è stata spostato di otto byte avanti,''
 
' ''per evitare un errore nel tentativo di deallocazione, riportiamo l'indicatore dell'indice interno otto byte indietro, ossia al byte "iniziale" dell'area di memoria:''</font>
 
   Free(p - 8)
 
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 106: Riga 97:
  
  
==Uso della funzione esterna ''bzero()'' della libreria di C==
+
==Uso della funzione esterna ''memset()'' della libreria di C==
La terza modalità prevede l'uso della funzione esterna ''memset()'' della libreria di C.
+
Si può utilizzare anche la funzione esterna ''memset()'' della libreria di C.
 +
<FONT Color=gray>' ''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.''</font>
 +
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
 +
 
 +
 
 +
<FONT Color=gray>' ''Ora azzeriamo tutti i valori del vettore:''</font>
 +
  memset(p, 0, 8)
 +
 +
<FONT Color=gray>' ''Vediamo in console il risultato:''</font>
 +
  For i = 0 To 7
 +
    Print Byte@(p + i)
 +
  Next
 +
 
 +
  st.Close
 +
  Free(p)
 +
 +
'''End'''
 +
 
  
Mostreremo un 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:
+
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:
 
  <FONT Color=gray>' ''void *memset(void *str, int c, size_t n)''
 
  <FONT Color=gray>' ''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.''</font>
 
  ' ''Copies the character c (an unsigned char) to the first n characters of the string pointed to, by the argument str.''</font>
Riga 117: Riga 146:
 
   '''Public''' Sub Main()
 
   '''Public''' Sub Main()
 
   
 
   
   Dim bb As Byte[] = [1, 2, 3, 4, 5, 6, 7, 8, 9]
+
   Dim bb As Byte[] = [1, 2, 3, 4, 5, 6, 7, 8]
 
   Dim b As Byte
 
   Dim b As Byte
 
   
 
   
 
  <FONT Color=gray>' ''Ora azzeriamo tutti i valori del vettore:''</font>
 
  <FONT Color=gray>' ''Ora azzeriamo tutti i valori del vettore:''</font>
   memset(bb<FONT Color=#B22222>.Data</font>, 0, 9)
+
   memset(bb<FONT Color=#B22222>.Data</font>, 0, 8)
 
   
 
   
 
  <FONT Color=gray>' ''Vediamo in console il risultato:''</font>
 
  <FONT Color=gray>' ''Vediamo in console il risultato:''</font>

Versione delle 01:45, 30 lug 2019

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