Rendere vettore una variabile inizialmente di tipo Oggetto

Da Gambas-it.org - Wikipedia.

Il caso è quello in cui si ha una variabile ordinaria di tipo Object, che si intende rendere vettoriale successivamente, ossia via codice, senza l'uso della parola New.

Se si intende caricare nella variabile di tipo "Oggetto" due o più variabili, le successive alla prima variabile caricata devono essere tutte del tipo identico a quello della prima variabile.

Si assegnerà, dunque, alla variabile Oggetto una variabile di qualsiasi tipo con la cura di porre quest'ultima all'interno di parentesi quadre. Bisogna tenere conto che all'atto di tale assegnazione la variabile di tipo Oggetto avrà inizialmente un numero di elementi uguale ad 1. Tale elemento avrà comunque un valore pari a zero, se la variabile assegnata per la trasformazione non possiede un valore diverso da zero o Null, altrimenti avrà il valore già posseduto da quella varibile utilizzata.

Questa modalità consentirà di caricare una variabile in una variabile di tipo "Oggetto" come fosse quest'ultimo un vettore.

Fatto ciò, dunque, si potrà usare la variabile di tipo Oggetto esattamente come fosse un vettore:

 Dim ob As Object

 ob = [ob]

 Print Object.Type(ob)

in questo caso la nuova variabile "ob" sarà un vettore di tipo Oggetto. Infatti la verifica restituisce in console: "Object[]".

Rendere una variabile di Classe Object un array di un tipo di dato nativo

Una variabile di Classe Object può essere resa un array di un tipo di dato nativo. Infatti, se la variabile fra le parentesi, assegnata a quella di tipo Oggetto, non è di tipo Oggetto, allora la variabile di tipo Object, trasformata in vettore, assumerà il tipo di dato della variabile assegnata:

 Dim ob As Object
 Dim i As Integer

 ob = [i]

la variabile "ob" diventa una nuova variabile vettoriale di tipo Integer. Questa circostanza può essere verificata mediante l'istruzione:

Print Object.Type(ob)

In questo caso, ovviamente, la nuova variabile vettoriale ob riceverà nei suoi elementi soltanto valori di tipo Integer. Infatti, se si verifica il tipo di valori che la varibile vettoriale ob è capace di assumere nei suoi elementi

Print ob.Type

si otterrà il valore " 4 ", ossia la costante che rappresenta appunto il tipo di dato Intero (Integer), e che corrisponde in Gambas alla definizione del tipo di dato gb.Integer .

Se alla originaria variabile di tipo Object vengono assegnati valori mediante una lista vettoriale, contenente tipi di dati diversi, non omogenei, la nuova variabile vettoriale assume ovviamente il tipo "Variant[]":

 Dim ob As Object

 ob = [99, "testo"]

 Print ob[1]

 Print Object.Type(ob)

il valore stringa del secondo elemento viene regolarmente accettato, e la verifica mediante il Metodo "Object.Type()" restituisce in console il risultato "Variant[]".

Se tra le parentesi quadre viene posto un qualsiasi valore numerico:

 Dim ob As Object

 ob = [99]

allora la variabile originaria di tipo Object diventa una nuova variabile vettoriale di tipo "Integer[]".

Analogamente, se tra le parentesi quadre viene posta una qualsiasi stringa:

 Dim ob As Object

 ob = ["a"]

o anche solo le due virgolette:

 ob = [""]

allora la variabile originaria di tipo Object diventa una nuova variabile vettoriale di tipo "String[]".

Esempio pratico

Mostriamo un esempio generico in cui due variabili iniziali di tipo Oggetto divengono rispettivamente una variabile vettoriale di tipo Intero ed una variabile vettoriale di tipo Struttura:

Public Struct Struttura
 b As Byte
 s As String
End Struct


Public Sub Main()

 
 Dim ob1, ob2 As Object
 Dim i As Integer
 Dim p As Pointer
 Dim st As New Struttura

 ob1 = [i]

 Print ob1.Count

 ob1[0] = 9

 ob1.Push(99)

 ob1.Push(99999)
 
' Verifichiamo il contenuto degli elementi della variabile "ob":
 Print ob1[0], ob1[1], ob1[2]

' Comportandosi la variabile di tipo Oggetto "ob1" come un vettore, si potranno ottenere i valori da essa contenuti anche così:
 p = ob1.Data
 Print Int@(p)
 Print Int@(p + 4)
 Print Int@(p + 8)

' Ora assegnamo la Struttura alla variabile di tipo Oggetto "ob2":
 ob2 = [st]

' A scopo didattico mostriamo soltanto il tipo di variabile assunto dalla originaria variabile "ob2":
 Print Object.Type(ob2)

End

Creare un array multidimensionale con una variabile di tipo Oggetto

Con le modalità analoghe al precedente paragrafo è possibile creare array multidimensionale con una ordinaria variabile di tipo Oggetto.

Mostriamo un esempio, nel quale viene caricato un vettore di tipo "Intero":

Public Sub Main()
 
 Dim ii As Integer[] = [2, 22, 222, 2222, 22222, 222222, 2222222]
 Dim nn As New Integer[]
 Dim ob As Object

' Inseriamo il vettore "ii[]" nella variabile "ob" di tipo "Oggetto", che così viene resa anch'essa una vettore (contenente oggetti, vettori):
 ob = [ii]

' Assegnamo alcuni valori ai membri dell'altro vettore di tipo "Intero":
 With nn
   .Push(3)
   .Push(333)
   .Push(33333)
 End With

' Inseriamo anche il vettore "nn[]" nella variabile vettoriale di tipo "Oggetto":
 ob.Push(nn)
   
' Andiamo a vedere i valori. Gli indici "0" e "1" della prima dimensione si riferiscono rispettivamente all'oggetto vettore "ii[]", che è zero, poiché è il primo inserito, ed all'oggetto vettore "nn[]", che è uno, poiché è 1, poiché è il secondo inserito. L'indice della seconda dimensione si riferisce all'elemento del vettore, contenuto dalla variabile "ob", di cui si intende leggere il valore:
 Print ob[0][2]

 Print ob[1][1]

End