Differenze tra le versioni di "Memset ()"

Da Gambas-it.org - Wikipedia.
 
Riga 7: Riga 7:
 
Volendola utilizzare in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale la funzione è contenuta:
 
Volendola utilizzare in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale la funzione è contenuta:
 
  Private <FONT color=#B22222>Extern memset</font>(buffer As Pointer, c As Byte, count As Long) In "<FONT color=#B22222>libc:6</font>"
 
  Private <FONT color=#B22222>Extern memset</font>(buffer As Pointer, c As Byte, count As Long) In "<FONT color=#B22222>libc:6</font>"
 
 
 
In questo esempio si modificheranno i primi 4 caratteri di una stringa:
 
In questo esempio si modificheranno i primi 4 caratteri di una stringa:
 
  <FONT color=Gray>' ''void * memset(void *buffer, int c, size_t count)''
 
  <FONT color=Gray>' ''void * memset(void *buffer, int c, size_t count)''
Riga 15: Riga 13:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim p As Pointer
 
   Dim p As Pointer
Riga 25: Riga 23:
 
   Print String@(p)
 
   Print String@(p)
 
   
 
   
 +
<FONT color=Gray>' ''Dealloca l'area di memoria precedentemente allocata e si assicura che il Puntatore non punti ad alcun indirizzo rilevante di memoria:''</font>
 
   Free(p)
 
   Free(p)
 
   p = 0
 
   p = 0
 
   
 
   
  '''End'''
+
  End
  
 
Ovviamente la destinazione potrà essere anche un ''Puntatore'', rappresentato dalla Proprietà ".Data" di un vettore:
 
Ovviamente la destinazione potrà essere anche un ''Puntatore'', rappresentato dalla Proprietà ".Data" di un vettore:
Riga 36: Riga 35:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim bb As New Byte[10]
 
   Dim bb As New Byte[10]
Riga 48: Riga 47:
 
   Next
 
   Next
 
    
 
    
  '''End'''
+
  End
  
 
===Uso di un vettore nel primo argomento della funzione esterna "memset()"===
 
===Uso di un vettore nel primo argomento della funzione esterna "memset()"===
Riga 59: Riga 58:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim bb As New Byte[10]
 
   Dim bb As New Byte[10]
Riga 70: Riga 69:
 
   Next
 
   Next
 
    
 
    
  '''End'''
+
  End
  
 
Altro esempio nel quale si azzereranno tutti gli elementi di un vettore di tipo "Integer[]":
 
Altro esempio nel quale si azzereranno tutti gli elementi di un vettore di tipo "Integer[]":
Riga 77: Riga 76:
 
  Private Extern<FONT color=#B22222> memset</font>(dest As integer[], c As Integer, count As Long) In "<FONT color=#B22222>libc:6</font>"
 
  Private Extern<FONT color=#B22222> memset</font>(dest As integer[], c As Integer, count As Long) In "<FONT color=#B22222>libc:6</font>"
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim ii As Integer[] = [1, 2, 3, 4, 5]
 
   Dim ii As Integer[] = [1, 2, 3, 4, 5]
Riga 89: Riga 88:
 
   Next
 
   Next
 
   
 
   
  '''End'''
+
  End

Versione attuale delle 14:15, 13 giu 2024

La funzione della libreria di C

void * memset( void *buffer, int c, size_t count )

copia il valore di "c" nell'area di memoria (puntata da una variabile di tipo Puntatore ) per una quantità stabilita nell'argomento count.
V'è da precisare che il valore del secondo parametro viene passato come un intero (int ), ma la funzione stessa riempie il blocco di memoria utilizzando la conversione di questo valore nel tipo "unsigned char " (ossia il tipo Byte di Gambas).


Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché bisognerà dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta:

Private Extern memset(buffer As Pointer, c As Byte, count As Long) In "libc:6"

In questo esempio si modificheranno i primi 4 caratteri di una stringa:

' void * memset(void *buffer, int c, size_t count)
' Copies the character c (an unsigned char) to the first count characters of the string pointed to, by the argument buffer.
Private Extern memset(buffer As Pointer, c As Integer, count As Long) In "libc:6"


Public Sub Main()

 Dim p As Pointer

 p = Alloc("Testo qualsiasi")

 memset(p, Asc("a"), 4)

 Print String@(p)

' Dealloca l'area di memoria precedentemente allocata e si assicura che il Puntatore non punti ad alcun indirizzo rilevante di memoria:
 Free(p)
 p = 0

End

Ovviamente la destinazione potrà essere anche un Puntatore, rappresentato dalla Proprietà ".Data" di un vettore:

' void * memset(void *buffer, int c, size_t count)
' Copies the character c (an unsigned char) to the first count characters of the string pointed to, by the argument buffer.
Private Extern memset(dest As Pointer, c As Integer, count As Long) In "libc:6"


Public Sub Main()

 Dim bb As New Byte[10]
 Dim b As Byte

' In questo caso al primo argomento della funzione passiamo il Puntatore all'area di memoria del vettore, ove sono memorizzati i dati contenuti dagli elementi del vettore medesimo. L'indirizzo di memoria di detta area è restituita dalla Proprietà ".Data" del vettore:
 memset(bb.Data, 100, 10)
  
 For Each b In bb
   Print b
 Next
 
End

Uso di un vettore nel primo argomento della funzione esterna "memset()"

Il primo argomento della funzione esterna "memset()", oltre a essere di tipo Puntatore, potrà essere anche un Vettore.

Vediamo un semplice esempio, nel quale si assegna il valore 100 agli elementi di un vettore di tipo "Byte[]":

' void * memset(void *buffer, int c, size_t count)
' Copies the character c (an unsigned char) to the first count characters of the string pointed to, by the argument buffer.
Private Extern memset(dest As Byte[], c As Integer, count As Long) In "libc:6"


Public Sub Main()

 Dim bb As New Byte[10]
 Dim b As Byte

 memset(bb, 100, 10)
  
 For Each b In bb
   Print b
 Next
 
End

Altro esempio nel quale si azzereranno tutti gli elementi di un vettore di tipo "Integer[]":

' void * memset(void *buffer, int c, size_t count)
' Copies the character c (an unsigned char) to the first count characters of the string pointed to, by the argument buffer.
Private Extern memset(dest As integer[], c As Integer, count As Long) In "libc:6"

Public Sub Main()

 Dim ii As Integer[] = [1, 2, 3, 4, 5]
 Dim i As Integer

' Se il vettore è di tipo "Integer", allora il valore del 3° parametro della funzione va moltiplicato per 4, poiché il valore di tipo "Intero" occupa nella memoria 4 byte:
 memset(ii, 0, ii.Count * SizeOf(gb.Integer))

 For Each i in ii
   Print i
 Next

End