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

Da Gambas-it.org - Wikipedia.
(Creata pagina con 'Per porre a zero uno o più valori contenuti dall'area di memoria allocata puntata da un ''Puntatore'', si potranno adottare almeno due modalità. ==Uso dei ''Memory Stream'...')
 
Riga 1: Riga 1:
Per porre a zero uno o più valori contenuti dall'area di memoria allocata puntata da un ''Puntatore'', si potranno adottare almeno due modalità.
+
Per porre a zero uno o più valori contenuti dall'area di memoria allocata puntata da un ''Puntatore'', si potranno adottare almeno tre modalità.
  
  
Riga 101: Riga 101:
 
  ' ''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>
 
  ' ''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)
 
   Free(p - 8)
 +
 +
'''End'''
 +
 +
 +
 +
==Uso della funzione esterna ''bzero()'' della libreria di C==
 +
La terza modalità prevede l'uso della funzione esterna ''memset()'' della libreria di C.
 +
 +
Mostreremo un esempio effettuato su una variabile vettoriale agendo attraverso la sua proprietà ''.Data'' che restituisce un ''Puntatore'' ai valori del vettore medesimo:
 +
<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 bb As Byte[] = [1, 2, 3, 4, 5, 6, 7, 8, 9]
 +
  Dim b As Byte
 +
 +
<FONT Color=gray>' ''Ora azzeriamo tutti i valori del vettore:''</font>
 +
  memset(bb<FONT Color=#B22222>.Data</font>, 0, 9)
 +
 +
<FONT Color=gray>' ''Vediamo in console il risultato:''</font>
 +
  For Each b In bb
 +
    Print b
 +
  Next
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 16:23, 15 ott 2015

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

  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 b = 1 to 8
   Print Byte@(p)
   p = p + 1
  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:
  p = p - 8
  For b = 1 to 8
   Print Byte@(p)
   p = p + 1
  Next

  st.Close

' 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:
  Free(p - 8)

End


Uso della funzione esterna bzero() della libreria di C

La seconda 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(sP As Pointer, size As Integer) In "libc:6"


 Public Sub Main()

 Dim p As Pointer
 Dim st As Stream
 Dim b As Byte

  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 b = 1 to 8
   Print Byte@(p)
   p = p + 1
  Next
  Print


' Ora azzeriamo quattro valori di seguito cominciando dal byte di indice 2:
  p = p - 8
  bzero(p + 2, 4)

' Torniamo a vedere in console il risultato:
  For b = 1 to 8
   Print Byte@(p)
   p = p + 1
  Next

  st.Close

' 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:
  Free(p - 8)

End


Uso della funzione esterna bzero() della libreria di C

La terza modalità prevede l'uso della funzione esterna memset() della libreria di C.

Mostreremo un esempio effettuato su una variabile vettoriale agendo attraverso la sua proprietà .Data che restituisce un Puntatore ai 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, 9]
 Dim b As Byte

' Ora azzeriamo tutti i valori del vettore:
  memset(bb.Data, 0, 9)

' Vediamo in console il risultato:
  For Each b In bb
    Print b
  Next

End