Strutture: dichiarazione ed uso

Da Gambas-it.org - Wikipedia.

La Struttura similmente all'Array aggrega due o più elementi. Però, mentre l'Array aggrega elementi del medesimo tipo (per esempio tutti valori di tipo Integer, o di tipo Byte, etc), la Struttura aggrega solitamente (ma non necessariamente) elementi di tipo diverso.

In Gambas3 la Struttura, analogamente ad un oggetto, può essere considerata una Classe senza metodi, che, come nel C, definisce e si riserva una porzione di memoria.

Dichiariamo una Struttura con dei campi, che dovranno essere riempiti con dei valori. Tale Struttura avrà un proprio nome e farà da modello alle particolari variabili di tipo Struttura che saranno effettivamente utilizzate per contenere valori.


Nell'esempio che segue, la Struttura modello avrà il nome: NomeStruttura, mentre la variabile del tipo di quella Struttura la chiameremo: variabStruttura:

Public Struct NomeStruttura    ' definiamo i campi della Struttura "modello"

' Questa Struttura si riserverà, occupandola, 9 byte di memoria in tutto:
  valore1 As String   ' dal byte n° 0 al n° 3
  valore2 As Integer   ' dal byte n° 4 al n° 7
  valore3 as Byte      ' il byte n° 8
 End Struct

' Dichiariamo una variabile di tipo Struttura (composta a perfetta immagine della Struttura modello):
   Private variabStruttura As New NomeStruttura

' E' possibile anche usare la parola "Struct" invece di New:
   Private variabStruttura As Struct NomeStruttura
 


Public Sub Form_Open()

 Dim variabValor as Byte

  var$ = Inputbox("Immettiamo un valore per \"riempire\" il campo \"variabile\" di \"nuovaStruttura\": valore3 .")

' Attribuiamo un valore a ciascun campo variabile della variabile di tipo Struttura
' (in questo esempio i valori sono due già definiti (3 e 6) ed il terzo che abbiamo immesso con "InputBox"):
  variabStruttura.valore1 = "Esempio sulle Strutture"
  variabStruttura.valore2 = 6
  variabStruttura.valore3 = var$

End


Public Sub Button1_Click()

' quindi operiamo con i valori contenuti dalla variabile "variabStruttura",
' per esempio li facciamo mostrare in console:
  With variabStruttura
    Print .valore1
    Print .valore2
    Print .valore3
  End With

End


Strutture contenenti Array e Matrici

Le Strutture possono essere costituite da campi di variabili Array e Matrici.

Esempio:

Public Struct StrutturaModello
    arB[10] As Byte       ' array monodimensionale definito
    arI As Integer[]      ' array monodimensionale non definito
    mt$[10, 4] As String  ' matrice
End Struct

 Private variabStruttura As New StrutturaModello


Public Sub Form_Open()

 Dim a, m As Byte

  variabStruttura.arI = New Integer[]

  For a = 0 To 9
    With variabStruttura
      .arB[a] = a
      .arI.Add(a + a)
        For m = 0 To 3
         .mt$[a, m] = Chr(variabStruttura.arI[a] + 70)
        Next
   End With
 Next

End


Public Sub Button1_Click()

 Dim a, m As Byte

  For a = 0 To 9
   With variabStruttura
    Print .arB[a]
    Print .arI[a]
    For m = 0 To 3
      Print .mt$[a, m]
    Next
   End With
 Next

End


Strutture che contengono altre Strutture

Le Strutture possono contenere, come proprio elemento, altre Strutture. Da tenere presente che è necessario dichiarare e definire la Struttura, che sarà contenuta nella Struttura principale, prima della dichiarazione della Struttura principale contenente.

Esempio:

' va dichiarata e definita innanzitutto la Struttura
' che sarà contenuta nella Struttura principale:
Public Struct strutturaInterna
  sb As Byte
  sI As Integer
  s$ As String
End Struct

Private internaStru As New strutturaInterna


' ...quindi la Struttura principale:
Public Struct StrutturaPrincipale
  prB As Byte
  prI As Integer
  internaStru As Struct strutturaInterna
End Struct

Private struttVariab As New StrutturaPrincipale



Public Sub Form_Open()

 Dim a As Byte

  a = 1

' Assegnamo i valori alle variabili contenute nei campi della variabile Struttura principale:
 With struttVariab
   .prB = 10
   .prI = 1000
   .internaStru.sb = a
   .internaStru.sI = struttVariab.prI + a
   .internaStru.s$ = "prova " & Str(a)
 End With

End


' Andiamo a mostrare i risultati in console:
Public Sub Button1_Click()

 Dim a As Byte

  a = 1

 With struttVariab
   Print .prB
   Print .prI
   Print .internaStru.sb
   Print .internaStru.sI
   Print .internaStru.s$
 End With

End

Il risultato in console sarà:
10
1000
1
1001
prova 1


Variabili array di tipo "Struttura"

E' infine possibile realizzare variabili array di tipo "Struttura".

Vettori con numero di elementi definito

Possiamo dichiarare e creare variabili array di tipo Struttura con numero di elementi definito.

1° esempio

Public Struct strutturaModello
 prB As Byte
 prI As Integer
End Struct

' Dichiariamo la variabile della Struttura come array con numero di elementi definito.
' Sarà necessario inserire dopo "As" la parola "Struct":
  Private strutturaVariabile[10] As Struct StrutturaModello


Public Sub Form_Open()

 Dim a As Byte

' Assegnamo i valori agli elementi della variabile array di tipo Struttura:
 For a = 0 To 9
   With strutturaVariabile[a]
     .prB = a
     .prI = 1000 + a
   End With
 Next

End


' Andiamo a mostrare i risultati in console:
Public Sub Button1_Click()

 Dim a As Byte

For a = 0 To 9
 With strutturaVariabile[a]
   Print .prB
   Print .prI
 End With
Next

End

2° esempio

Public Struct strutturaModello
 prB As Byte
 prI As Integer
End Struct

' Dichiariamo la variabile della Struttura come array con numero di elementi definito.
' In questo caso sarà necessario inserire dopo "As" la parola "New":
  Private strutturaVariabile As New StrutturaModello[10]


Public Sub Form_Open()

Dim a As Byte

' Assegnamo i valori agli elementi della variabile array di tipo Struttura:
  For a = 0 To 9

    strutturaVariabile[a] = New StrutturaModello

    With strutturaVariabile[a]
     .prB = a
     .prI = 1000 + a
    End With

  Next

End


' Andiamo a mostrare i risultati in console:
Public Sub Button1_Click()

 Dim a As Byte

 For a = 0 To 9
   With strutturaVariabile[a]
     Print .prB
     Print .prI
   End With
 Next

End


Vettori con numero di elementi indefinito

E' possibile creare una variabile array di tipo Struttura avente numero di elementi non predefinito. Si potranno quindi aggiungere gli elementi alla variabile vettore ogni qual volta le si attribuisce una variabile semplcie di tipo Struttura.

Esempio:

Public Struct strutturaModello
 prB As Byte
 prI As Integer
End Struct

' Dichiariamo la variabile della Struttura come array con numero di elementi indefinito.
' In questo caso sarà necessario inserire dopo "As" la parola "New":
  Private prima As New StrutturaModello[]


Public Sub Form_Open()

  Dim a As Byte

' Dichiariamo un'altra variabile del tipo della Struttura modello:
  Dim seconda As StrutturaModello

' Assegnamo i valori agli elementi della variabile normale di tipo Struttura:
  For a = 0 To 9

' Va prevista ovviamente la creazione di ogni variabile di tipo Struttura:
    seconda = New StrutturaModello

    With seconda
     .prB = a
     .prI = 1000 + a
    End With

' La variabile Struttura array vuole una variabile Struttura (non array) del tipo "StrutturaModello":
    prima.Add(seconda)

  Next

End


' Andiamo a mostrare i risultati in console:
Public Sub Button1_Click()

 Dim a As Byte

 For a = 0 To 9
   With prima[a]
     Print .prB
     Print .prI
   End With
  Next

End