Differenze tra le versioni di "Contenere valori di diverso tipo"

Da Gambas-it.org - Wikipedia.
 
(3 versioni intermedie di uno stesso utente non sono mostrate)
Riga 2: Riga 2:
  
  
Per contenere, invece, insieme valori di tipo ''diverso'' |[[#Note|1]]|, che occupano cioè porzioni di memoria non uguali fra loro, è possibile utilizzare: |[[#Note|2]]|
+
Per contenere, invece, insieme valori di tipo ''diverso'' <SUP>&#091;[[#Note|nota 1]]&#093;</sup>, che occupano cioè porzioni di memoria non uguali fra loro, è possibile utilizzare: <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
 
* una variabile vettoriale di tipo ''<SPAN Style="text-decoration:underline">Variant</span>'';
 
* una variabile vettoriale di tipo ''<SPAN Style="text-decoration:underline">Variant</span>'';
 
* la ''[[Strutture:_dichiarazione_ed_uso|Struttura]]'';
 
* la ''[[Strutture:_dichiarazione_ed_uso|Struttura]]'';
* l'allocazione di memoria con la funzione ''[[Assegnare_ad_un_Puntatore_un'area_di_memoria_riservata_con_Alloc()|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'');
+
* l'allocazione di memoria con la funzione "[[Assegnare_ad_un_Puntatore_un'area_di_memoria_riservata_con_Alloc()|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 ''[[Variabile_del_tipo_di_una_Classe_specifica_creata|Classe specifica]]'' appositamente creata;
 
* una ''[[Variabile_del_tipo_di_una_Classe_specifica_creata|Classe specifica]]'' appositamente creata;
* una variabile vettoriale di tipo ''Object''. |[[#Note|2]]|
+
* una variabile vettoriale di tipo ''Object''. <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
  
  
Riga 16: Riga 16:
 
[2] La sola circostanza di voler contenere insieme variabili di tipo diverso (potremmo dire: ''allocare memoria con tipi di unità quantitative diverse'') ci costringe a <SPAN style="text-decoration:underline">non</span> utilizzare un ''vettore'' (''array''), fatta eccezione per:
 
[2] La sola circostanza di voler contenere insieme variabili di tipo diverso (potremmo dire: ''allocare memoria con tipi di unità quantitative diverse'') ci costringe a <SPAN style="text-decoration:underline">non</span> utilizzare un ''vettore'' (''array''), fatta eccezione per:
 
* il vettore di tipo ''Variant'', esempio:
 
* il vettore di tipo ''Variant'', esempio:
  '''Public''' Struct Struttura
+
  Public Struct Struttura
 
   a As Byte
 
   a As Byte
 
   i As Integer
 
   i As Integer
 
   s As Short
 
   s As Short
  '''End''' Struct
+
  End Struct
   
+
 
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
   
 
   
 
   Dim vnt As New <FONT color=#B22222>Variant[]</font>
 
   Dim vnt As New <FONT color=#B22222>Variant[]</font>
Riga 33: Riga 33:
 
   Dim stt2 as new Struttura
 
   Dim stt2 as new Struttura
 
   
 
   
 
+
  With stt1
    With stt1
+
    .a = 10
      .a = 10
+
    .i = 100000
      .i = 100000
+
    .s = 1000
      .s = 1000
+
  End With
    End With
 
 
    
 
    
 
  <FONT color=gray>' ''Inseriamo nel vettore di tipo 'Variant' variabili di tipo differente fra loro'':</font>
 
  <FONT color=gray>' ''Inseriamo nel vettore di tipo 'Variant' variabili di tipo differente fra loro'':</font>
    With vnt
+
  With vnt
      .Add(stt1)
+
    .Add(stt1)
      .Add(b)
+
    .Add(b)
      .Add(sh)
+
    .Add(sh)
      .Add(i)
+
    .Add(i)
      .Add(st)
+
    .Add(st)
    End With
+
  End With
 
   
 
   
    stt2 = vnt[0]
+
  stt2 = vnt[0]
 
   
 
   
    Print stt2.a
+
  Print stt2.a
    Print stt2.i
+
  Print stt2.i
    Print stt2.s
+
  Print stt2.s
    Print vnt[1]
+
  Print vnt[1]
    Print vnt[2]
+
  Print vnt[2]
    Print vnt[3]
+
  Print vnt[3]
    Print vnt[4]
+
  Print vnt[4]
 
+
 
  '''End'''
+
  End
  
 
* il vettore di tipo ''Object'', esempio:
 
* il vettore di tipo ''Object'', esempio:
  '''Public''' Struct Prova
+
  Public Struct Prova
 
   a As Byte
 
   a As Byte
 
   b As Short
 
   b As Short
  '''End''' Struct
+
  End Struct
 
   
 
   
  '''Private''' v As Struct Prova
+
  Private v As Struct Prova
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim a As New Byte[4]
 
   Dim a As New Byte[4]
Riga 78: Riga 77:
 
   Dim ob As New <FONT color=#B22222>Object[]</font>
 
   Dim ob As New <FONT color=#B22222>Object[]</font>
 
   
 
   
 +
  With v
 +
    .a = 99
 +
    .b = 999
 +
  End With
 +
  ob.Add(v)
 +
  Print ob[0].a
 +
  Print ob[0].b
 +
  Print
 
   
 
   
  With v
+
  a = [1, 2, 3, 4]
    .a = 99
+
  ob.Add(a)
    .b = 999
+
  Print ob[1][0]
  End With
+
  Print ob[1][1]
  ob.Add(v)
+
  Print ob[1][2]
  Print ob[0].a
+
  Print ob[1][3]
  Print ob[0].b
+
  Print
  Print
 
 
   
 
   
  a = [1, 2, 3, 4]
+
  b = 4
  ob.Add(a)
+
  p = VarPtr(b)
  Print ob[1][0]
+
  t = Memory p For Read
  Print ob[1][1]
+
  ob.Add(t)
  Print ob[1][2]
+
  Read #ob[2], b
  Print ob[1][3]
+
  Print b
  Print
+
  Print
 
   
 
   
  b = 4
+
  End
  p = VarPtr(b)
 
  t = Memory p For Read
 
  ob.Add(t)
 
  Read #ob[2], b
 
  Print b
 
  Print
 
   
 
'''End'''
 
 
Una eccezione all'uso del vettore di tipo ''Object'' è data con i ''Puntatori'', i quali non  consentono che siano assegnati ad un elemento di un vettore di tipo ''Oggetto'' nella modalità vista appena sopra. Questo ostacolo, però può essere aggirato come segue:
 
Una eccezione all'uso del vettore di tipo ''Object'' è data con i ''Puntatori'', i quali non  consentono che siano assegnati ad un elemento di un vettore di tipo ''Oggetto'' nella modalità vista appena sopra. Questo ostacolo, però può essere aggirato come segue:
  ''' Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 +
  Dim b As Byte
 
   Dim p As Pointer
 
   Dim p As Pointer
 
   Dim o As Object
 
   Dim o As Object
 
   Dim ob As New Object[]
 
   Dim ob As New Object[]
 
   
 
   
 +
  b = 99
 +
  p = VarPtr(b)
 +
  <FONT color=#B22222>o = [p]</font>
 +
  ob.Add(o)
 +
  Print Val("&" & Pointer@(ob[0][0]))
 
   
 
   
  b = 99
+
  End
  p = VarPtr(b)
 
  <FONT color=#B22222>o = [p]</font>
 
  ob.Add(o)
 
  Print Val("&" & Pointer@(ob[0][0]))
 
   
 
'''End'''
 

Versione attuale delle 08:52, 28 set 2023

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]

  • una 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] La sola circostanza di voler contenere insieme variabili di tipo diverso (potremmo dire: allocare memoria con tipi di unità quantitative diverse) ci costringe a non utilizzare un vettore (array), fatta eccezione per:

  • il vettore di tipo Variant, esempio:
Public Struct Struttura
  a As Byte
  i As Integer
  s As Short
End Struct
 

Public Sub Form_Open()

 Dim vnt As New Variant[]
 Dim st As String = "testo qualsiasi"
 Dim b As Byte = 99
 Dim sh As Short = 999
 Dim i As Integer = 99999
 Dim stt1 as new Struttura
 Dim stt2 as new Struttura

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

 stt2 = vnt[0]

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

Private v As Struct Prova


Public Sub Main()

 Dim a As New Byte[4]
 Dim p As Pointer
 Dim t As Stream
 Dim b As Byte
 Dim ob As New Object[]

 With v
   .a = 99
   .b = 999
 End With
 ob.Add(v)
 Print ob[0].a
 Print ob[0].b
 Print

 a = [1, 2, 3, 4]
 ob.Add(a)
 Print ob[1][0]
 Print ob[1][1]
 Print ob[1][2]
 Print ob[1][3]
 Print

 b = 4
 p = VarPtr(b)
 t = Memory p For Read
 ob.Add(t)
 Read #ob[2], b
 Print b
 Print

End

Una eccezione all'uso del vettore di tipo Object è data con i Puntatori, i quali non consentono che siano assegnati ad 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
 p = VarPtr(b)
 o = [p]
 ob.Add(o)
 Print Val("&" & Pointer@(ob[0][0]))

End