Differenze tra le versioni di "Definizione ed uso dei Memory Stream"

Da Gambas-it.org - Wikipedia.
Riga 22: Riga 22:
 
   
 
   
 
   Dim p As Pointer
 
   Dim p As Pointer
  Dim sWR As Stream
 
 
   Dim b As Byte
 
   Dim b As Byte
 
   
 
   
Riga 36: Riga 35:
 
     Write #sWR, b As Byte
 
     Write #sWR, b As Byte
 
   Next
 
   Next
 +
 +
<Font Color= #006400>' ''Chiudiamo il flusso e liberiamo la parte di memoria precedentemente allocata:''</font>
 +
  Free(p)
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 43: Riga 45:
 
In modalità "''For Read''" i Memory-Stream possono essere usati per [[Variabili_di_tipo_Puntatore_e_loro_dereferenziazione|dereferenziare i puntatori]].
 
In modalità "''For Read''" i Memory-Stream possono essere usati per [[Variabili_di_tipo_Puntatore_e_loro_dereferenziazione|dereferenziare i puntatori]].
  
Abbiamo visto nell'esempio del precedente paragrafo, relativo alla modalità in "''scrittura''" dei Memory-Stream, che quattro valori numerici sono stati memorizzati in un area riservata, pumtata dalla variabile puntatore "p".
+
Riprendiamo l'esempio del precedente paragrafo, relativo alla modalità in "''scrittura''" dei Memory-Stream. Lì abbiamo visto che quattro valori numerici sono stati memorizzati in un area riservata, pumtata dalla variabile puntatore "p".
  
 
Ora procediamo a dereferenziare quella variabile di tipo ''pointer'', e ad estrarre i valori contenuti nell'aera riservata di memoria:
 
Ora procediamo a dereferenziare quella variabile di tipo ''pointer'', e ad estrarre i valori contenuti nell'aera riservata di memoria:
Riga 59: Riga 61:
 
   Next
 
   Next
 
   
 
   
  <Font Color= #006400>' ''Liberiamo la parte di memoria precedentemente allocata:''</font>
+
  <Font Color= #006400>' ''Chiudiamo il flusso e liberiamo la parte di memoria precedentemente allocata:''</font>
    Free(p)
+
  sWR.Close
 +
  Free(p)
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 94: Riga 97:
 
       Print "Contenuto dello stream: "; ss
 
       Print "Contenuto dello stream: "; ss
 
   
 
   
  <Font Color= #006400>' ''Liberiamo la parte di memoria precedentemente allocata:''</font>
+
  <Font Color= #006400>' ''Chiudiamo il flusso e liberiamo la parte di memoria precedentemente allocata:''</font>
 +
    st.Close
 
     Free(p)
 
     Free(p)
 
   
 
   
Riga 139: Riga 143:
 
   
 
   
 
  <Font Color= #006400>' ''Liberiamo la parte di memoria precedentemente allocata:''</font>
 
  <Font Color= #006400>' ''Liberiamo la parte di memoria precedentemente allocata:''</font>
 +
    m.Close
 
     Free(p)
 
     Free(p)
 
   
 
   
Riga 162: Riga 167:
 
  <Font Color= #006400>'Andiamo a dereferenziare e, quindi, a leggere il dato:''</font>
 
  <Font Color= #006400>'Andiamo a dereferenziare e, quindi, a leggere il dato:''</font>
 
   Read #pS, by
 
   Read #pS, by
 +
 +
  pS.Close
 
    
 
    
 
  <Font Color= #006400>' ''Ora, a fini didattici, mostriamo il valore in console:''</font>
 
  <Font Color= #006400>' ''Ora, a fini didattici, mostriamo il valore in console:''</font>

Versione delle 12:10, 18 set 2014

La classe Memory-Stream crea flussi che utilizzano la memoria, anziché un disco o una connessione di rete. Pertanto, i "Memory-Stream" sono dei flussi di dati in memoria.

Con Gambas-3 non è più possibile usare un puntatore (Pointer) in uno stream. Si deve invece utilizzare uno stream di memoria con l'istruzione MEMORY.

Pertanto, in sostanza la classe Memory-Stream serve per leggere e per scrivere in una variabile di tipo Puntatore che punta ad un'area di memoria riservata.

Sintassi:

Flusso = MEMORY Puntatore FOR [ READ ] [ WRITE ]
  • Se la parola chiave READ viene specificata, allora è permessa la lettura.
  • Se la parola chiave WRITE viene specificata, allora è permessa la scrittura.


Memory Stream in modalità "For Write"

La modalità in "Scrittura" (For Write) risulta utile nel caso si debbano scrivere dei valori all'interno di un'area di memoria riservata, allocata. Si può quindi scrivere nella variabile Stream con l'istruzione "Write" o anche con l'istruzione "Print".

Per esempio, se si intende creare una sequenza di byte &h80, &h81, &h82, &h83, lo si può fare con i chr(); oppure si può scrivere:

Private sWR As Stream


Public Sub Button1_Click()

 Dim p As Pointer
 Dim b As Byte

' Riserviamo 4 byte da qualche parte in memoria:
  p = Alloc(4)

' Questa memoria sarà un flusso (stream) che creeremo appositamente, e...
  sWR = Memory p For Write

' ...nel quale andiamo a scrivere i 4 valori byte.
' Ogni valore byte occuperà la dimensione di 1 byte, quindi copriranno esattamente i 4 byte allocati:
  For bWr = 80 to 83
    Write #sWR, b As Byte
  Next

' Chiudiamo il flusso e liberiamo la parte di memoria precedentemente allocata:
  Free(p)

End


Memory Stream in modalità "For Read"

In modalità "For Read" i Memory-Stream possono essere usati per dereferenziare i puntatori.

Riprendiamo l'esempio del precedente paragrafo, relativo alla modalità in "scrittura" dei Memory-Stream. Lì abbiamo visto che quattro valori numerici sono stati memorizzati in un area riservata, pumtata dalla variabile puntatore "p".

Ora procediamo a dereferenziare quella variabile di tipo pointer, e ad estrarre i valori contenuti nell'aera riservata di memoria:

Public Sub Button2_Click()

Dim j, b As Byte

 For j = 0 To 3
' Reimpostiamo la lettura dello "stream" dall'indice 0:
   Seek #sWR, j
   Read #sWR, b

' A fini didattici, mostriamo il valore in console
   Print "---> ", b
 Next

' Chiudiamo il flusso e liberiamo la parte di memoria precedentemente allocata:
 sWR.Close
 Free(p)

End


Altri esempi sulla scrittura e lettura delle variabili di tipo "Stream"

Scriviamo nello Stream un testo, poi lo recuperiamo leggendo lo Stream:

Public Sub Button1_Click()

 Dim p As Pointer
 Dim st As Stream
 Dim s, ss As String
 Dim j As Byte
 
   p = Alloc(4)
   
   st = Memory p For Read Write
   
   s = "testo qualsiasi"
   
' Scriviamo la stringa nella variabile di tipo "Stream":
   Print #st, s

  '''''''''''''''

' Leggiamo nella variabile di tipo "Stream"

' Poiché con la precedente scrittura l'indice dello "stream"
' è incrementato di uno, si dovrà re-impostare la lettura all'indice zero:
     Seek #st, 0
     Line Input #st, ss

     Print "Contenuto dello stream: "; ss

' Chiudiamo il flusso e liberiamo la parte di memoria precedentemente allocata:
   st.Close
   Free(p)

End


Secondo esempio - leggiamo con l'istruzione Shell congiunta al comando bash "ls" nella cartella "/proc", e riportiamo in una TextArea il contenuto ivi letto distinguendo ciascuna sub-cartella o file mediante Line Input:

Public Sub Button1_Click()

 Dim s, ss As String
 Dim p As Pointer
 Dim m As Stream
 Dim j As Integer
  
 
  Shell "ls /proc" To s

' Allochiamo sufficiente memoria,
' e vi puntiamo con una variabile di tipo "puntatore":
  p = Alloc(2048)
 
' Creiamo la variabile "m" di tipo "Stream":
  m = Memory p For Read Write
 
' Scriviamo nella variabile "m" il contenuto della variabile stringa "s":
 Print #m, s


  While Not Eof(m)
' Guidiamo la lettura nella variabile "m" mediante il comando "Seek":
    Seek #m, j
    Line Input #m, ss

' Se non vi sono più dati relativi a caratteri alfanumerici, allora si esce dal ciclo:
      If ss = "" Then Exit

    TextArea1.Text = TextArea1.Text & ss & Chr(10)

' Si dà il valore al comando "Seek per far cominciare"
' la lettura dal byte corrispondente nella variabile "s" ad ogni inizio riga:
    j = j + Len(ss) + 1

  Wend

' Liberiamo la parte di memoria precedentemente allocata:
   m.Close
   Free(p)

End


In modalità "Lettura" per dereferenziare i puntatori passati da funzioni esterne

Si procederà ugualmente per dereferenziare i puntatori passati da funzioni esterne.

Public Sub Button1_Click()

 Dim pEst As Pointer
 Dim pS As Stream
 Dim by As Byte

' Prendiamo da una funzione esterna un valore di tipo puntatore:
  funzione_esterna_che_passa_un puntatore(pEst)

' Usiamo i Memory Stream in modalità di "lettura":
  pS = Memory pEst For Read

'Andiamo a dereferenziare e, quindi, a leggere il dato:
  Read #pS, by

  pS.Close
 
' Ora, a fini didattici, mostriamo il valore in console:
  Print by

End