Differenze tra le versioni di "Scrivere nell'area di memoria puntata da un Puntatore"

Da Gambas-it.org - Wikipedia.
Riga 2: Riga 2:
  
 
==Uso dei ''Memory Stream''==
 
==Uso dei ''Memory Stream''==
In particolare, in Gambas non è possibile scrivere i dati <SPAN Style="text-decoration:underline">direttamente</span> nella variabile di tipo ''Puntatore'', ma si deve far uso della risorsa degli ''Stream''.
+
In particolare, in Gambas non è possibile scrivere i dati <SPAN Style="text-decoration:underline">direttamente</span> nella variabile di tipo ''Puntatore'', ma si deve far uso della risorsa degli ''[https://gambaswiki.org/wiki/comp/gb/stream?l=it Stream]''.
 
+
<BR>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 dati chiamato appunto ''Stream'', nel quale si effettuerà la scrittura dei dati (come sappiamo è possibile anche la lettura di dati da un ''Puntatore'').
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 <SPAN Style="text-decoration:underline">non</span> la variabile di tipo ''Stream'' utilizzata per la scrittura !
+
<BR>Avvenuta la scrittura dei dati nell'area di memoria puntata dal ''Puntatore'', si continuerà a operare con il ''Puntatore'' medesimo (ad esempio ad una funzione esterna verrà passato il ''Puntatore'' referenziato, e <SPAN Style="text-decoration:underline">non</span> la variabile di tipo ''Stream'' utilizzata per la scrittura !). Va comunque ricordato che anche ogni operazione successiva di <SPAN Style="text-decoration:underline">Scrittura</span>, che vorrà effettuarsi <SPAN Style="text-decoration:underline">mediante la risorsa ''Memory Stream''</span> sul ''Puntatore'' referenziato, andrà effettuata - come già visto - utilizzando il tipo di dati ''Stream''.
 
 
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:
 
Mostriamo di seguito un semplice esempio:
Riga 14: Riga 12:
 
   Dim st As Stream
 
   Dim st As Stream
 
   Dim b As Byte
 
   Dim b As Byte
 +
  Dim i As Integer
 
    
 
    
  <FONT Color=gray>' ''Con la funzione "Alloc()" allochiamo - ad esempio - 8 byte di memoria, che sarà puntata da un "Puntatore":''</font>
+
  <FONT Color=gray>' ''Con la funzione "Alloc()" alloca - ad esempio - 8 byte di memoria, che sarà puntata da un "Puntatore":''</font>
 
   p = Alloc(SizeOf(gb.Byte), 8)
 
   p = Alloc(SizeOf(gb.Byte), 8)
 
   
 
   
  <FONT Color=gray>' ''Con la risorsa "Memory Stream" generiamo una variabile di tipo "Stream", che ci consentirà di scrivere nell'area di memoria riservata puntata dal "Puntatore":''</font>
+
  <FONT Color=gray>' ''Con la risorsa "Memory Stream" genera una variabile di tipo "Stream", che consentirà di scrivere nell'area di memoria riservata puntata dal "Puntatore":''</font>
 
   st = Memory p For <FONT Color=#B22222>Write</font>
 
   st = Memory p For <FONT Color=#B22222>Write</font>
 
   
 
   
  <FONT Color=gray>' ''Scriviamo a titolo esemplificativo alcuni dati nell'area di memoria riservata:''</font>
+
  <FONT Color=gray>' ''Scrive a titolo esemplificativo alcuni dati nell'area di memoria riservata:''</font>
 
   For b = 1 To 8
 
   For b = 1 To 8
 
     <FONT Color=#B22222>Write #st</font>, b * 10 As Byte
 
     <FONT Color=#B22222>Write #st</font>, b * 10 As Byte
Riga 27: Riga 26:
 
   
 
   
 
  <FONT Color=gray>' ''Verifica il risultato in console:''</font>
 
  <FONT Color=gray>' ''Verifica il risultato in console:''</font>
   For b = 0 To 7
+
   For i = 0 To 7
     Print Byte@(p + CInt(b))
+
     Print Byte@(p + i)
 
   Next
 
   Next
 
   
 
   
Riga 55: Riga 54:
 
   
 
   
 
   Dim p As Pointer
 
   Dim p As Pointer
   Dim b As Byte
+
   Dim i As Integer
 
   
 
   
 
   p = Alloc(SizeOf(gb.Byte), 8)   
 
   p = Alloc(SizeOf(gb.Byte), 8)   
 
    
 
    
 
  <FONT Color=gray>' ''Scrive nell'area di memoria puntata dal "Puntatore":''</font>
 
  <FONT Color=gray>' ''Scrive nell'area di memoria puntata dal "Puntatore":''</font>
   For b = 0 To 7
+
   For i = 0 To 7
     memset(p + CInt(b), (b + 1) * 10, 1)
+
     memset(p + i, (i + 1) * 10, 1)
 
   Next
 
   Next
 
   
 
   
 
  <FONT Color=gray>' ''Verifica il risultato in console:''</font>
 
  <FONT Color=gray>' ''Verifica il risultato in console:''</font>
   For b = 0 To 7
+
   For i = 0 To 7
     Print Byte@(p + CInt(b))
+
     Print Byte@(p + i)
 
   Next
 
   Next
 
   
 
   

Versione delle 15:52, 7 set 2022

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 dati chiamato appunto Stream, nel quale si effettuerà la scrittura dei dati (come sappiamo è possibile anche la lettura di dati da un Puntatore).
Avvenuta la scrittura dei dati nell'area di memoria puntata dal Puntatore, si continuerà a operare con 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 comunque ricordato che anche ogni operazione successiva di Scrittura, che vorrà effettuarsi mediante la risorsa Memory Stream sul Puntatore referenziato, andrà effettuata - come già visto - utilizzando il tipo di dati Stream.

Mostriamo di seguito un semplice esempio:

Public Sub Main()

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

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

' Scrive 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 i = 0 To 7
   Print Byte@(p + i)
 Next

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

' Libera la memoria precedentemente allocata e si assicura che il Puntatore non punti a un indirizzo di memoria rilevante:
 Free(p)
 p = 0

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 i As Integer

  p = Alloc(SizeOf(gb.Byte), 8)  
  
' Scrive nell'area di memoria puntata dal "Puntatore":
  For i = 0 To 7
    memset(p + i, (i + 1) * 10, 1)
  Next

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

' Libera la memoria precedentemente allocata e si assicura che il Puntatore non punti a un indirizzo di memoria rilevante:
 Free(p)
 p = 0

End