Differenze tra le versioni di "Assegnare ad un Puntatore un'area di memoria riservata con Alloc()"

Da Gambas-it.org - Wikipedia.
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per riservare un'area di memoria, si può utilizzare la funzione '''''Alloc()''''':
+
Per riservare un'area di memoria, si può utilizzare la funzione [https://gambaswiki.org/wiki/lang/alloc?l=it '''Alloc()''']:
 
  <FONT Color=#B22222>Alloc</font>(Dimensione As Variant, Count As Integer) As Pointer
 
  <FONT Color=#B22222>Alloc</font>(Dimensione As Variant, Count As Integer) As Pointer
Riservare, o allocare, un'area di memoria significa far sì che tale porzione di memoria venga protetta, ossia non venga sovrascritta dal sistema, sino a quando non sarà esplicitamente liberata/deallocata mediante la funzione ''[[Free|Free( )]]''. <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
+
Riservare, o allocare, un'area di memoria significa far sì che tale porzione di memoria venga protetta, ossia non venga sovrascritta dal sistema, sino a quando non sarà esplicitamente liberata/deallocata mediante la funzione "[[Free|Free()]]".
  
L'allocazione della memoria avviene specificando la dimensione del tipo di valore, al quale i dati da scrivervi appartengono, ed il numero di byte (celle) di memoria da allocare. La dimensione totale della memoria riservata è dunque data dal prodotto dei due parametri della funzione ''Alloc( )''.
+
L'allocazione della memoria avviene specificando la dimensione del tipo di valore, al quale i dati da scrivervi appartengono, ed il numero di byte (celle) di memoria da allocare. La dimensione totale della memoria riservata è dunque data dal prodotto dei due parametri della funzione "Alloc()".
 
    
 
    
L'area di memoria allocata viene puntata da una variabile di tipo ''Puntatore'' <SUP>&#091;[[#Note|Nota 2]]&#093;</sup> restituita dalla funzione ''Alloc()''. Il ''Puntatore'' referenzia una determinata porzione di memoria pari al prodotto del valore dei due argomenti della funzione ''Alloc()'' medesima. Questa variabile di tipo ''Puntatore'', potendo essere considerata come una chiave di accesso all'allocazione di memoria, consente di gestire tale area di memoria riservata.
+
L'area di memoria allocata viene puntata da una variabile di tipo ''Puntatore'' <SUP>&#091;[[#Note|Nota 1]]&#093;</sup> restituita dalla funzione "Alloc()". Il ''Puntatore'' referenzia una determinata porzione di memoria pari al prodotto del valore dei due argomenti della funzione "Alloc()" medesima. Questa variabile di tipo ''Puntatore'', potendo essere considerata come una chiave di accesso all'allocazione di memoria, consente di gestire tale area di memoria riservata.
<BR>In particolare la funzione ''Alloc( )'' alloca la quantità di memoria richiesta e restituisce una variabile di tipo ''Puntatore'', ossia una variabile contenente l'indirizzo della prima cella dell'area di memoria riservata in questione.
+
<BR>In particolare la funzione "Alloc()" alloca la quantità di memoria richiesta e restituisce una variabile di tipo ''Puntatore'', ossia una variabile contenente l'indirizzo della prima cella dell'area di memoria riservata in questione.
  
 
Proprio in questo senso il ''Puntatore'' è una variabile di tipo ''generico'', in quanto punta ad un'area di memoria di dimensione non pre-definita ''nativamente'' da Gambas (come invece è per quella delle altre variabili: ''Byte'' che occupa 1 byte, ''Short'' che occupa 2 byte, ''Integer'' che occupa 4 byte, e così via).
 
Proprio in questo senso il ''Puntatore'' è una variabile di tipo ''generico'', in quanto punta ad un'area di memoria di dimensione non pre-definita ''nativamente'' da Gambas (come invece è per quella delle altre variabili: ''Byte'' che occupa 1 byte, ''Short'' che occupa 2 byte, ''Integer'' che occupa 4 byte, e così via).
Riga 14: Riga 14:
  
 
==Liberare la memoria precedentemente allocata==
 
==Liberare la memoria precedentemente allocata==
Per liberare (deallocare) la porzione di memoria, precedentemente allocata, è necessario usare la funzione ''[[Free|Free( )]]'':
+
Per liberare (deallocare) la porzione di memoria, precedentemente allocata, è necessario usare la funzione "[[Free|Free()]]":
 
  <FONT Color=#B22222>Free</font>(puntatore)
 
  <FONT Color=#B22222>Free</font>(puntatore)
  
 +
===Garantire che il Puntatore non punti ad un'area di memoria rilevante===
 +
Sebbene deallocata la memoria mediante la funzione "Free()", è possibile anche garantire che la variabile di tipo ''Puntatore'' non punti ad un'area di memoria rilevante, assegnando al ''Puntatore'' il valore di default zero:
 +
...
 +
 +
Free(puntatore)
 +
 +
puntatore = 0
  
==Uso di ''Alloc()'' con i valori numerici==
+
 
Se la funzione ''Alloc()'' viene utilizzata con valori numerici, allora essa alloca un'area di memoria avente la dimensione indicata dal valore numerico moltiplicata per l'intero ''eventualmente'' indicato nella variabile ''Conta''. Come valore predefinito la variabile ''Conta'' è uguale a 1:
+
==Uso di "Alloc()" con i valori numerici==
 +
Se la funzione "Alloc()" viene utilizzata con valori numerici, allora essa alloca un'area di memoria avente la dimensione indicata dal valore numerico moltiplicata per l'intero ''eventualmente'' indicato nella variabile ''Conta''. Come valore predefinito la variabile ''Conta'' è uguale a 1:
 
  Alloc(Dimensione AS Integer[, Conta AS Integer ]) As Pointer
 
  Alloc(Dimensione AS Integer[, Conta AS Integer ]) As Pointer
  
  
 
Esempio essenziale:
 
Esempio essenziale:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
+
 
   Dim p As Pointer
 
   Dim p As Pointer
 
    
 
    
 
  <FONT Color=gray>' ''Alloca un'area di memoria pari a 1x64 byte:''</font>
 
  <FONT Color=gray>' ''Alloca un'area di memoria pari a 1x64 byte:''</font>
  p = <FONT Color=#B22222>Alloc</font>(SizeOf(gb.Byte), 64)
+
  p = <FONT Color=#B22222>Alloc</font>(SizeOf(gb.Byte), 64)
 
    
 
    
 
  <FONT Color=gray>' ''Dealloca l'area di memoria precedentemente riservata:''</font>
 
  <FONT Color=gray>' ''Dealloca l'area di memoria precedentemente riservata:''</font>
  Free(p)
+
  Free(p)
 
+
 
  '''End'''
+
  End
  
  
 
+
==Uso di "Alloc()" con le stringhe==
==Uso di ''Alloc()'' con le stringhe==
+
Se la funzione "Alloc()" viene utilizzata con valori di tipo stringa, essa alloca un'area di memoria contenente la stringa indicata
Se la funzione ''Alloc()'' viene utilizzata con valori di tipo stringa, essa alloca un'area di memoria contenente la stringa indicata
 
 
  Alloc(Stringa As String)  As Pointer
 
  Alloc(Stringa As String)  As Pointer
 
E' sufficiente in tal caso la sola specificazione in un parametro della stringa da allocare.
 
E' sufficiente in tal caso la sola specificazione in un parametro della stringa da allocare.
Riga 46: Riga 53:
  
 
Esempio essenziale:
 
Esempio essenziale:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
+
 
   Dim p As Pointer
 
   Dim p As Pointer
 
    
 
    
 
  <FONT Color=gray>' ''Alloca un'area di memoria con una Stringa:''</font>
 
  <FONT Color=gray>' ''Alloca un'area di memoria con una Stringa:''</font>
  p = <FONT Color=#B22222>Alloc</font>("Stringa qualsiasi")
+
  p = <FONT Color=#B22222>Alloc</font>("Stringa qualsiasi")
 
    
 
    
 
  <FONT Color=gray>' ''Dealloca l'area di memoria precedentemente riservata:''</font>
 
  <FONT Color=gray>' ''Dealloca l'area di memoria precedentemente riservata:''</font>
  Free(p)
+
  Free(p)
 
+
 
  '''End'''
+
  End
 
 
 
 
  
  
 +
----
 
=Note=
 
=Note=
[1] In tal senso una variabile di tipo ''Puntatore'', contenente l'indirizzo di una porzione di memoria allocata, viene definita come "''non automatica''"; nel senso che essa non si distrugge al termine di una sub-routine, ma resta in vita mantenendo così anche allocata inutilmente l'afferente porzione di memoria.
+
[1] L'uso di variabili di tipo ''Puntatore'' è in fondo il modo più vicino alla macchina per trattare i dati, poiché che la CPU accede ai dati in memoria tramite indirizzi (ovvero ''Puntatori'').
 
+
<BR>Un ''Puntatore'' è una "variabile" che punta all'indirizzo di memoria di un'altra variabile. Infatti la variabile di tipo "Puntatore" contiene un indirizzo di memoria ed è particolarmente utile per la modifica di parametri mediante [[Extern:_richiamare_funzioni_esterne_a_Gambas|funzioni esterne]]. In Gambas non c'è bisogno di fare uso dei "Puntatori", perché solitamente si ricorre alle [[Le_Variabili#Dichiarazione_delle_variabili_Globali|variabili "globali"]] che sono più semplici da gestire.
[2] L'uso di variabili di tipo ''Puntatore'' è in fondo il modo più vicino alla macchina per trattare i dati, poiché che la CPU accede ai dati in memoria tramite indirizzi (ovvero ''Puntatori'').
 

Versione attuale delle 17:32, 12 lug 2023

Per riservare un'area di memoria, si può utilizzare la funzione Alloc():

Alloc(Dimensione As Variant, Count As Integer) As Pointer

Riservare, o allocare, un'area di memoria significa far sì che tale porzione di memoria venga protetta, ossia non venga sovrascritta dal sistema, sino a quando non sarà esplicitamente liberata/deallocata mediante la funzione "Free()".

L'allocazione della memoria avviene specificando la dimensione del tipo di valore, al quale i dati da scrivervi appartengono, ed il numero di byte (celle) di memoria da allocare. La dimensione totale della memoria riservata è dunque data dal prodotto dei due parametri della funzione "Alloc()".

L'area di memoria allocata viene puntata da una variabile di tipo Puntatore [Nota 1] restituita dalla funzione "Alloc()". Il Puntatore referenzia una determinata porzione di memoria pari al prodotto del valore dei due argomenti della funzione "Alloc()" medesima. Questa variabile di tipo Puntatore, potendo essere considerata come una chiave di accesso all'allocazione di memoria, consente di gestire tale area di memoria riservata.
In particolare la funzione "Alloc()" alloca la quantità di memoria richiesta e restituisce una variabile di tipo Puntatore, ossia una variabile contenente l'indirizzo della prima cella dell'area di memoria riservata in questione.

Proprio in questo senso il Puntatore è una variabile di tipo generico, in quanto punta ad un'area di memoria di dimensione non pre-definita nativamente da Gambas (come invece è per quella delle altre variabili: Byte che occupa 1 byte, Short che occupa 2 byte, Integer che occupa 4 byte, e così via).

La memoria allocata rimane intatta fino a quando il programma non termina.


Liberare la memoria precedentemente allocata

Per liberare (deallocare) la porzione di memoria, precedentemente allocata, è necessario usare la funzione "Free()":

Free(puntatore)

Garantire che il Puntatore non punti ad un'area di memoria rilevante

Sebbene deallocata la memoria mediante la funzione "Free()", è possibile anche garantire che la variabile di tipo Puntatore non punti ad un'area di memoria rilevante, assegnando al Puntatore il valore di default zero:

...

Free(puntatore)

puntatore = 0


Uso di "Alloc()" con i valori numerici

Se la funzione "Alloc()" viene utilizzata con valori numerici, allora essa alloca un'area di memoria avente la dimensione indicata dal valore numerico moltiplicata per l'intero eventualmente indicato nella variabile Conta. Come valore predefinito la variabile Conta è uguale a 1:

Alloc(Dimensione AS Integer[, Conta AS Integer ]) As Pointer


Esempio essenziale:

Public Sub Main()

 Dim p As Pointer
 
' Alloca un'area di memoria pari a 1x64 byte:
 p = Alloc(SizeOf(gb.Byte), 64)
  
' Dealloca l'area di memoria precedentemente riservata:
 Free(p)
 
End


Uso di "Alloc()" con le stringhe

Se la funzione "Alloc()" viene utilizzata con valori di tipo stringa, essa alloca un'area di memoria contenente la stringa indicata

Alloc(Stringa As String)  As Pointer

E' sufficiente in tal caso la sola specificazione in un parametro della stringa da allocare.

La dimensione dell'area di memoria allocata è uguale alla lunghezza della stringa più un ulteriore byte necessario al terminatore di stringa che è il carattere NULL.

Esempio essenziale:

Public Sub Main()

 Dim p As Pointer
 
' Alloca un'area di memoria con una Stringa:
 p = Alloc("Stringa qualsiasi")
  
' Dealloca l'area di memoria precedentemente riservata:
 Free(p)
 
End



Note

[1] L'uso di variabili di tipo Puntatore è in fondo il modo più vicino alla macchina per trattare i dati, poiché che la CPU accede ai dati in memoria tramite indirizzi (ovvero Puntatori).
Un Puntatore è una "variabile" che punta all'indirizzo di memoria di un'altra variabile. Infatti la variabile di tipo "Puntatore" contiene un indirizzo di memoria ed è particolarmente utile per la modifica di parametri mediante funzioni esterne. In Gambas non c'è bisogno di fare uso dei "Puntatori", perché solitamente si ricorre alle variabili "globali" che sono più semplici da gestire.