Contenere valori di diverso tipo

Da Gambas-it.org - Wikipedia.
Versione del 9 nov 2024 alle 04:01 di Vuott (Discussione | contributi)

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

Come è noto una variabile di tipo vettore (array) è un'area di memoria riservata nella quantità determinata da una molteplicità di variabili del medesimo tipo, ossia che occupano tutte una uguale quantità di memoria.


Per contenere, invece, insieme valori di tipo diverso [nota 1], che occupano cioè porzioni di memoria non uguali fra loro, è possibile utilizzare: [nota 2]

  • la variabile vettoriale di tipo Variant;
  • la Struttura;
  • l'allocazione di memoria con la funzione "Alloc()", alla quale farà riferimento una variabile di tipo Puntatore. Per ricavare dati da tale area allocata, sarà necessario usare i Memory-Stream in modalità lettura (For Read ). Per scrivere, invece, dati in tale area di memoria così allocata, l'istruzione Memory sarà impostata in scrittura (For Write);
  • una Classe specifica appositamente creata;
  • una variabile vettoriale di tipo Object. [nota 2]


Note

[1] Poniamo il caso di voler contenere insieme variabili dei seguenti tipi: una variabile di tipo Byte, una variabile di tipo Short, tre variabili di tipo Integer ed una variabile di tipo Long. I tipi di queste variabili non sono omogenei, nel senso che occupano ciascuno una quantità di memoria diversa. Infatti, come si sa, la variabile di tipo Byte occupa un solo byte di memoria; la variabile di tipo Short occupa due byte di memoria; la variabile di tipo Integer occupa quattro byte di memoria; la variabile di tipo Long occupa otto byte di memoria.

[2] L'uso di un vettore (array) non è adatto per contenere insieme variabili di tipo diverso, fatta eccezione per:

  • il vettore di tipo Variant.

Nell'esempio, che segue, inseriremo nel vettore di tipo Variant variabili di tipo differente fra loro:

Public Struct Struttura
  a As Byte
  i As Integer
  s As Short
End Struct
 

Public Sub Main()

 Dim vnt As New Variant[]
 Dim st As New Struttura
 Dim b As Byte = 99
 Dim c As Short = 999
 Dim i As Integer = 99999
 Dim s As String = "testo qualsiasi"

 With st
   .a = 10
   .i = 100000
   .s = 1000
 End With
 
' Inseriamo nel vettore di tipo 'Variant' variabili di tipo differente fra loro:
 With vnt
   .Push(st)
   .Push(b)
   .Push(c)
   .Push(i)
   .Push(s)
 End With

 Print vnt[0].a
 Print vnt[0].i
 Print vnt[0].s
 Print vnt[1]
 Print vnt[2]
 Print vnt[3]
 Print vnt[4]
 
End
  • il vettore di tipo Object, esempio:
Public Struct Struttura
  a As Byte
  b As Short
End Struct


Public Sub Main()

 Dim ob As New Object[]
 Dim s As New Struttura
 Dim bb As New Byte[4]
 Dim b As Byte
 Dim st As Stream

 With s
   .a = 99
   .b = 999
 End With
 ob.Push(s)

 bb = [1, 2, 3, 4]
 ob.Push(bb)

 b = 4
 st = Memory VarPtr(b) For Read
 ob.Push(st)

 Print ob[0].a
 Print ob[0].b
 Print

 Print ob[1][0]
 Print ob[1][1]
 Print ob[1][2]
 Print ob[1][3]
 Print

' Il terzo elemento del vettore "ob" contiene una variabile di tipo "Stream":
 Read #ob[2], b
 st.Close
 Print b

End

Una eccezione all'uso del vettore di tipo Object è data dai Puntatori, i quali - non essendo degli Oggetti, bensì Tipi di dati - non consentono che essi siano assegnati a un elemento di un vettore di tipo Oggetto nella modalità vista appena sopra.
Questo ostacolo, però può essere aggirato come segue:

Public Sub Main()

 Dim b As Byte
 Dim p As Pointer
 Dim o As Object
 Dim ob As New Object[]

 b = 99
' Crea un "Puntatore" alla variabile "b":
 p = VarPtr(b)
' Trasforma il "Puntatore" in un dato di tipo "Object" e lo assegna alla variabile "o":
 o = [p]
' Inserisce la variabile "o" nel vettore di tipo "Object[]":
 ob.Push(o)
' Dereferenzia il "Puntatore" contenuto nell'array di tipo "Object".
' (Il vettore "ob" contiene un Oggetto "ob[0]", che contiene un Puntatore "ob[0][0]")
 Print Byte@(ob[0][0])

End