Differenze tra le versioni di "Strutture: dichiarazione ed uso"

Da Gambas-it.org - Wikipedia.
 
(89 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
La '''Struttura''' similmente al ''vettore'' (''Array'') aggrega due o più elementi. Però, mentre il vettore 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.
+
La '''Struttura''' <SUP>&#091;[[#Note|nota 1]]&#093;</sup> similmente al ''vettore'' (''Array'') aggrega due o più elementi. Però, mentre il vettore 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.
+
In Gambas la ''Struttura'' può essere considerata una "Classe" priva di ''Metodi'' e di ''Eventi'', che, come nel C, definisce e si riserva una porzione di memoria. Più precisamente la ''Struttura'' in Gambas è semplicemente una Classe <SPAN Style="text-decoration:underline">senza</span> ''Proprietà'', ''Metodi'' ed ''Eventi'', ed essendo dichiarabile esclusivamente ''Pubblica'', conseguentemente i suoi membri sono "Pubblici". <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
  
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.
+
La ''Struttura'', variabile strutturata di reminescenza del C, è un "''tipo derivato'' " che aggrega elementi di tipo diverso. Ci si serve di essa, qualora si abbia necessità di utilizzare un'area riservata di memoria di tipi di dati <SPAN Style="text-decoration:underline">''non''</span> omogenei.
  
  
Nell'esempio che segue, la ''Struttura'' modello avrà il nome: ''NomeStruttura'', mentre la variabile del tipo di quella ''Struttura'' la chiameremo: ''variabileStruttura'':
+
=Dichiarazione di una Struttura=
  '''Public''' Struct <Font Color= #B22222>NomeStruttura</font>   <Font Color= #006400>' ''definiamo i campi della Struttura "modello"''</font>
+
La ''Struttura'' va dichiarata <SPAN Style="text-decoration:underline">sempre</span> con la parola chiave ''Public'' :
 +
<Font Color=red><B>Public</b></font> '''Struct''' Nome_della_Struttura
 +
  nome_membro1 As ''tipo''
 +
  nome_membro2 As ''tipo''
 +
  etc....
 +
'''End Struct'''
 +
laddove:
 +
* '''''Struct''''' è la parola-chiave che introduce alla dichiarazione della ''Struttura'';
 +
* '''''Nome_della_Struttura''''' è l'etichetta che attribuisce un nome alla dichiarazione della ''Struttura'';
 +
* '''''nome_membro1''''' e '''''nome_membro2''''' sono le variabili della ''Struttura'' destinate a ricevere ciascuna un valore (in base al proprio tipo di dati di appartenenza);
 +
* '''''tipo''''' è il ''tipo'' di dati (''Byte'', ''Short'', ''Integer'', etc.), al quale il membro della ''Struttura'' appartiene.
 +
 
 +
La dichiarazione della ''Struttura'' termina <SPAN Style="text-decoration:underline">sempre</span> con le parole-chiave ''End Struct'' .
 +
 
 +
====Esempio astratto====
 +
Mostriamo un esempio astratto, nel quale dichiariamo una ''Struttura'' con dei membri, 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.
 +
<BR>La ''Struttura'' modello avrà il nome: ''NomeStruttura'', mentre la variabile del tipo di quella ''Struttura'' la chiameremo: ''variabileStruttura'':
 +
  Public Struct <Font Color= #B22222>NomeStruttura</font>
 +
<Font Color=gray>' ''definiamo i membri della Struttura "modello".''
 +
' ''Questa Struttura si riserverà, occupandola, 8 byte di memoria in tutto:''</font>
 +
  valore1 As Byte    <Font Color= #006400>' ''Occupa 1 byte + un altro in questo caso per l'allineamento (byte di indici 0 e 1) ''</font>
 +
  valore2 As Short    <Font Color= #006400>' ''Occupa 2 byte: da quello di indice 2 a quello di indice 3''</font>
 +
  valore3 as Integer  <Font Color= #006400>' ''Occupa 4 byte: da quello di indice 4 a quello di indice 7''</font>
 +
End Struct
 
   
 
   
  <Font Color= #006400>' ''Questa Struttura si riserverà, occupandola, 9 byte di memoria in tutto:''</font>
+
  <Font Color=gray>' ''Possiamo ovviamente dichiarare la variabile di tipo Struttura come "Globale":''</font>
  valore1 As String  <Font Color= #006400>' ''dal byte n° 0 al n° 3''</font>
+
<Font Color=gray>' Private variabileStruttura As '''New''' NomeStruttura</font>
  valore2 As Byte    <Font Color= #006400>' ''il byte n° 4''</font>
 
  valore3 as Integer  <Font Color= #006400>' ''dal byte n° 5 al byte n° 8''</font>
 
  '''End''' Struct
 
 
   
 
   
<Font Color= #006400>' ''Dichiariamo una variabile di tipo Struttura (composta a perfetta immagine della Struttura modello):''</font>
 
    '''Private''' <Font Color= #0000FF>variabileStruttura</font> As New <Font Color= #B22222>NomeStruttura</font>
 
 
   
 
   
  <Font Color= #006400>' ''E' possibile anche usare la parola "'''Struct"''' invece di New:''
+
Public Sub Main()
    Private variabileStruttura As '''Struct''' NomeStruttura</font>
+
 
 
+
  <Font Color=gray>' ''Dichiariamo in questo semplice esempio la variabile di tipo "Struttura" come "locale":''</font>
 +
  Dim <Font Color= #0000FF>variabileStruttura</font> As New <Font Color= #B22222>NomeStruttura</font>
 
   
 
   
 +
<Font Color=gray>' ''Attribuiamo un valore a ciascun membro della variabile di tipo Struttura nel rispetto del proprio tipo di dati:''</font>
 +
  <Font Color= #0000FF>variabileStruttura</font>.valore1 = 4
 +
  <Font Color= #0000FF>variabileStruttura</font>.valore2 = 444
 +
  <Font Color= #0000FF>variabileStruttura</font>.valore3 = 44444
 
   
 
   
  '''Public''' Sub Form_Open()
+
  <Font Color=gray>' ''Quindi operiamo con i valori contenuti dalla variabile "variabileStruttura", per esempio li facciamo mostrare in console:</font>
 +
  With <Font Color= #0000FF>variabileStruttura</font>
 +
    Print .valore1
 +
    Print .valore2
 +
    Print .valore3
 +
  End With
 
   
 
   
  Dim variabValor as Byte
+
End
 +
 
 +
 
 +
=Dichiarazione e creazione delle variabili di tipo Struttura=
 +
La dichiarazione e la creazione di una variabile di tipo  ''Struttura'' può richiedere l'uso della parola-chiave '''New'''.
 +
<BR>Con l'uso della parola-chiave "''New'' " viene creato l'Oggetto (ossia la variabile) del tipo della Classe Struttura dichiarata dall'utente.
 +
 
 +
L'uso della parola-chiave "New" in fase di dichiarazione della variabile di tipo ''Struttura'' è richiesto, quando vi è l'assegnazione diretta di un dato ad uno o più membri della ''Struttura'' all'interno di una routine, e, quindi, anche quando si deve passare a una funzione una variabile di tipo Struttura.
 +
 
 +
Esempio:
 +
Public Struct STRUTTURA
 +
  b As Byte
 +
  s As Short
 +
End Struct
 
   
 
   
  var$ = Inputbox("Immettiamo un numero per \"riempire\" il campo \"valore3\" di \"variabileStruttura\": valore3 .")
 
 
   
 
   
  <Font Color= #006400>' ''Attribuiamo un valore a ciascun campo variabile della variabile di tipo Struttura''
+
  Public Sub Main()
' ''(in questo esempio i valori sono due già definiti (3 e 6) ed il terzo che abbiamo immesso con "InputBox"):''</font>
 
  <Font Color= #0000FF>variabileStruttura</font>.valore1 = "Esempio sulle Strutture"
 
  <Font Color= #0000FF>variabileStruttura</font>.valore2 = 6
 
  <Font Color= #0000FF>variabileStruttura</font>.valore3 = Val(var$)
 
 
   
 
   
  '''End'''
+
  Dim sr As <FONT Color=red>'''New'''</font> STRUTTURA
 +
 
 +
  <FONT Color=gray>' ''Assegnazione diretta di un valore a un membro nella routine'':</font>
 +
  sr.s = 999
 
   
 
   
 +
<FONT Color=gray>' ''Passaggio per "indirizzo" della variabile di tipo Struttura ad una funzione'':</font>
 +
  Prova(sr)
 +
 
 +
  Print sr.b
 +
 
 +
End
 
   
 
   
'''Public''' Sub Button1_Click()
 
 
   
 
   
  <Font Color= #006400>' ''quindi operiamo con i valori contenuti dalla variabile "variabStruttura",''
+
Private Function Prova(t as STRUTTURA)
' ''per esempio li facciamo mostrare in console:</font>
+
 
  With <Font Color= #0000FF>variabileStruttura</font>
+
  <FONT Color=gray>' ''Assegnazione diretta di un valore a un membro nella routine della funzione:''</font>
     Print .valore1
+
  t.b = 99
    Print .valore2
+
      
    Print .valore3
+
  End
  End With
 
   
 
'''End'''
 
  
 
+
Non è invece richiesto nella routine principale, quando alla variabile deve essere assegnata una ''Struttura'' quale ritorno di una Funzione, nella quale è stata ''creata''.
=Strutture contenenti Vettori e Matrici=
+
<BR>Dunque non sarà necessaria la parola-chiave "New" in una routine principale, qualora la variabile del tipo della ''Struttura'', dichiarata e creata in una Funzione o in una Procedura, venga restituita alla routine principale che ha invocato la Funzione o la Procedura.
Le Strutture possono essere costituite da campi di variabili vettoriali (''Array'') e Matrici.
 
  
 
Esempio:
 
Esempio:
 
+
  Public Struct STRUTTURA
  '''Public''' Struct <Font Color= #B22222>StrutturaModello</font>
+
  b As Byte
    arB[10] As Byte       <Font Color= #006400>' ''array monodimensionale definito''</font>
+
  s As Short
    arI As Integer[]      <Font Color= #006400>' ''array monodimensionale non definito''</font>
+
End Struct
    mt$[10, 4] As String <Font Color= #006400>' ''matrice''</font>
+
  '''End''' Struct
+
 +
Public Sub Main()
 +
 +
  Dim sr As STRUTTURA    <Font Color= gray>' ''Qui non serve la parola-chiave "New", perché la variabile Struttura sarà istanziata nella Funzione chiamata !</font>
 +
 
 +
  <FONT Color= gray>' ''La Funzione invocata restituisce una Struttura istanziata nella Funzione medesima:</font>
 +
  sr = Prova(9, 199)
 +
 
 +
  Print sr.b
 +
  Print sr.s
 +
 
 +
  End
 
   
 
   
  '''Private''' <Font Color= #0000FF>variabileStruttura</font> As New <Font Color= #B22222>StrutturaModello</font>
 
 
   
 
   
 +
Private Function Prova(vlb As Byte, vlc As Short) As STRUTTURA  <Font Color= gray>' ''La Funzione restituisce la Struttura</font>
 +
 
 +
  Dim tt As New STRUTTURA  <FONT Color= gray>' ''Crea la variabile del tipo della Struttura dichiarata all'inizio (Struct "STRUTTURA")</font>
 +
 
 +
  tt.b = vlb * 10
 +
  tt.s = vlc * 100
 +
 
 +
  Return tt
 +
 
 +
End
 +
 +
====Uso della parola-chiave "Struct"====
 +
E' possibile anche usare la parola-chiave "'''Struct'''", ma solo per la dichiarazione di una variabile ''globale'' di tipo della "Struttura" di riferimento.
 +
Public Struct STRUTTURA
 +
  b As Byte
 +
  c As Short
 +
End Struct
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Private variabileStruttura As <FONT Color=green>'''Struct'''</font> STRUTTURA
 
   
 
   
  Dim a, m As Byte
+
Public Sub Main()
 
   
 
   
  <Font Color= #0000FF>variabileStruttura</font>.arI = New Integer[]
+
......
 +
Questa parola-chiave incorpora una "Struttura" direttamente all'interno di una variabile o di un'altra Struttura, come fa C per impostazione predefinita. Quindi il contenuto della "Struttura" viene incorporato nell'Oggetto in cui è dichiarato. Di conseguenza, per usarlo come ogni altro Oggetto, Gambas deve creare un Oggetto temporaneo. Ciò lo rende più lento rispetto all'utilizzo di un Oggetto reale.
 +
 
 +
 
 +
=Passaggio di una Struttura a una Funzione=
 +
Una variabile di tipo ''Struttura'' può senz'altro essere passata (e ritornata) "''per Valore''" a una Funzione o a una Procedura; ma, poiché tale variabile è in sostanza un ''Puntatore'', contenente l'indirizzo di memoria della Struttura, sarà più opportuno e più adeguato passarla "''per Indirizzo''" (analogamente a quanto avviene con gli array): <SUP>&#091;[[#Note|nota 3]]&#093;</sup>
 +
Public Struct STRUTTURA
 +
  b As Byte
 +
  c As Short
 +
End Struct
 
   
 
   
  For a = 0 To 9
 
    With <Font Color= #0000FF>variabileStruttura</font>
 
      .arB[a] = a
 
      .arI.Add(a + a)
 
        For m = 0 To 3
 
          .mt$[a, m] = Chr(<Font Color= #0000FF>variabileStruttura</font>.arI[a] + 70)
 
        Next
 
    End With
 
  Next
 
 
   
 
   
  '''End'''
+
  Public Sub Main()
 +
 
 +
  Dim sr as New STRUTTURA
 +
 
 +
  sr.b = 10
 +
  sr.c = 100
 +
 
 +
  Funzione(sr)  <Font Color=gray>' ''La variabile di tipo Struttura viene passata per "Indirizzo"''</font>
 +
 
 +
  Print sr.b
 +
  Print sr.c
 +
 
 +
End
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Private Function Funzione(sra As STRUTTURA)
 +
 
 +
  sra.b *= 10
 +
  sra.c *= 10
 +
 
 +
End
 +
 
 +
 
 +
=Strutture contenenti Vettori e Matrici=
 +
Le Strutture possono essere costituite da membri di variabili vettoriali (''Array'' ) e Matrici annidate.
 +
<BR>Se il membro è di tipo array di numero di elementi non definito, dovrà essere istanziato opportunamente con la parola-chiave "NEW".
 +
 
 +
Esempio:
 +
 
 +
Public Struct <Font Color= #B22222>StrutturaModello</font>
 +
  mt110] As Byte      <Font Color= #006400>' ''array monodimensionale annidato definito''</font>
 +
  arI As Integer[]      <Font Color= #006400>' ''array monodimensionale non definito''</font>
 +
  mt2[10, 4] As Byte    <Font Color= #006400>' ''matrice annidata''</font>
 +
End Struct
 +
 
 
   
 
   
 +
Public Sub Form_Open()
 +
 
 +
  Dim <Font Color= #0000FF>variabileStruttura</font> As New <Font Color= #B22222>StrutturaModello</font> <FONT Color= gray>' ''Crea l'Oggetto del tipo della Struttura dichiarata</font>
 
   Dim a, m As Byte
 
   Dim a, m As Byte
 
   
 
   
  For a = 0 To 9
+
<FONT Color= gray>' ''Crea l'Oggetto del tipo vettore "Intero" del membro della Struttura dichiarata:</font>
 +
  <Font Color= #0000FF>variabileStruttura</font>.arI = <B>New</b> Integer[]
 +
 +
<FONT Color= gray>' ''Assegna dei valori a ciascun membro della "Struttura":</font>
 +
  For a = 0 To 9
 
     With <Font Color= #0000FF>variabileStruttura</font>
 
     With <Font Color= #0000FF>variabileStruttura</font>
    Print .arB[a]
+
      .mt1[a] = a
    Print .arI[a]
+
      .arI.Push(a)
    For m = 0 To 3
+
      For m = 0 To 3
      Print .mt$[a, m]
+
        .mt2[a, m] = a + 1
    Next
+
      Next
 
     End With
 
     End With
 
   Next
 
   Next
 +
 
 +
<FONT Color= gray>' ''Verifica i valori assegnati a ciascun membro della "Struttura":</font>
 +
  With <Font Color= #0000FF>variabileStruttura</font>
 +
    Print "mt1"
 +
    For a = 0 To 9
 +
      Print .mt1[a]
 +
    Next
 +
    Print
 +
    Print
 +
    Print "arI"
 +
    For a = 0 To 9
 +
      Print .arI[a]
 +
    Next
 +
    Print
 +
    Print
 +
    Print "mt2"
 +
    For a = 0 To 9
 +
      For m = 0 To 3
 +
        Print .mt2[a, m]
 +
      Next
 +
    Next
 +
    Print
 +
  End With
 
   
 
   
  '''End'''
+
  End
 
 
  
  
 
=Strutture che contengono altre Strutture=
 
=Strutture che contengono altre Strutture=
Le Strutture possono contenere, come proprio elemento, altre Strutture.
+
Le ''Strutture'' possono contenere, come proprio membro, altre Strutture. In tal caso la ''Struttura'' principale è chiamata "''Struttura innestata''", mentre quella richiamata nel membro della ''Struttura'' principale è chiamata "''Struttura innesto''".
Da tenere presente che è necessario dichiarare e definire la Struttura, che sarà contenuta nella Struttura principale, <Span style="text-decoration:underline">prima</span> della dichiarazione  della Struttura principale contenente.
+
Da tenere presente che è necessario dichiarare e definire la ''Struttura'' "''innesto''", che sarà contenuta nella ''Struttura'' principale, <Span style="text-decoration:underline">prima</span> della dichiarazione  della ''Struttura'' principale contenente.
  
 
Esempio:
 
Esempio:
 
+
  <Font Color= #006400>' ''Va dichiarata e definita innanzitutto la Struttura "innesto"'' che sarà contenuta nella Struttura principale:''</font>
  <Font Color= #006400>' ''va dichiarata e definita innanzitutto la Struttura''
+
  Public Struct <Font Color= #FF0000>strutturaInnesto</font>
' ''che sarà contenuta nella Struttura principale:''</font>
 
  '''Public''' Struct <Font Color= #FF0000>strutturaInterna</font>
 
 
   sb As Byte
 
   sb As Byte
 
   sI As Integer
 
   sI As Integer
 
   s$ As String
 
   s$ As String
  '''End''' Struct
+
  End Struct
 
   
 
   
'''Private''' <Font Color= #FFA500>internaStru</font> As New <Font Color= #FF0000>strutturaInterna</font>
 
 
   
 
   
+
  <Font Color= #006400>' ''...poi va dichiarata la Struttura principale "innestata", ossia quella che conterrà la Struttura "innesto".''
  <Font Color= #006400>' ''...quindi la Struttura principale, ossia quella che conterrà la Struttura interna:''</font>
+
' ''In un suo membro verrà dichiarata la variabile di tipo della Struttura "innesto" (che si intende appunto contenere in quella principale):''</font>
  '''Public''' Struct <Font Color= #0000FF>StrutturaPrincipale</font>
+
  Public Struct <Font Color= #0000FF>StrutturaPrincipale</font>
 
   prB As Byte
 
   prB As Byte
 
   prI As Integer
 
   prI As Integer
   <Font Color= #FFA500>internaStru</font> As Struct <Font Color= #FF0000>strutturaInterna</font>
+
   <Font Color= #FFA500>innestoStru</font> As Struct <Font Color= #FF0000>strutturaInnesto</font> <Font Color=gray>' ''oppure più semplicemente: <B>innestoStru As strutturaInnesto</b></font>
'''End''' Struct
+
End Struct
 
   
 
   
'''Private''' <Font Color= #1E90FF>struttVariab</font> As New <Font Color= #0000FF>StrutturaPrincipale</font>
 
 
   
 
   
 +
Public Sub Main()
 
   
 
   
+
  Dim <Font Color= #1E90FF>struttVariab</font> As New <Font Color= #0000FF>StrutturaPrincipale</font>
'''Public''' Sub Form_Open()
 
 
 
   Dim a As Byte
 
   Dim a As Byte
 
   
 
   
  a = 1
+
  a = 1
 
   
 
   
  <Font Color= #006400>' ''Assegnamo i valori alle variabili contenute nei campi della variabile Struttura principale:''</font>
+
  <Font Color=gray>' ''Assegniamo i valori alle variabili contenute nei membri della variabile Struttura principale:''</font>
 
   With <Font Color= #1E90FF>struttVariab</font>
 
   With <Font Color= #1E90FF>struttVariab</font>
 
     .prB = 10
 
     .prB = 10
 
     .prI = 1000
 
     .prI = 1000
     .<Font Color= #FFA500>internaStru</font>.sb = a
+
     .<Font Color= #FFA500>innestoStru</font>.sb = a
     .<Font Color= #FFA500>internaStru</font>.sI = <Font Color= #1E90FF>struttVariab</font>.prI + a
+
     .<Font Color= #FFA500>innestoStru</font>.sI = <Font Color= #1E90FF>struttVariab</font>.prI + a
     .<Font Color= #FFA500>internaStru</font>.s$ = "prova " & Str(a)
+
     .<Font Color= #FFA500>innestoStru</font>.s$ = "prova " & Str(a)
 
   End With
 
   End With
+
 
'''End'''
+
  <Font Color=gray>' ''Mostra i risultati in console:''</font>
 
 
  <Font Color= #006400>' ''Andiamo a mostrare i risultati in console:''</font>
 
'''Public''' Sub Button1_Click()
 
 
  Dim a As Byte
 
 
  a = 1
 
 
 
   With <Font Color= #1E90FF>struttVariab</font>
 
   With <Font Color= #1E90FF>struttVariab</font>
 
     Print .prB
 
     Print .prB
 
     Print .prI
 
     Print .prI
     Print .<Font Color= #FFA500>internaStru</font>.sb
+
     Print .<Font Color= #FFA500>innestoStru</font>.sb
     Print .<Font Color= #FFA500>internaStru</font>.sI
+
     Print .<Font Color= #FFA500>innestoStru</font>.sI
     Print .<Font Color= #FFA500>internaStru</font>.s$
+
     Print .<Font Color= #FFA500>innestoStru</font>.s$
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
  
 
Il risultato in console sarà:
 
Il risultato in console sarà:
Riga 171: Riga 284:
 
<BR>1001
 
<BR>1001
 
<BR>prova 1
 
<BR>prova 1
 
  
  
Riga 177: Riga 289:
 
E' infine possibile realizzare variabili array di tipo "''Struttura''".
 
E' infine possibile realizzare variabili array di tipo "''Struttura''".
  
 +
La dichiarazione di variabili vettoriali di tipo ''Struttura'' può avvenire:
 +
<BR>- mediante la parola ''Struct''. Tale dichiarazione è ''Statica'';
 +
<BR>- mediante la parola ''New''. Tale dichiarazione è ''Dinamica''.
  
==Vettori con numero di elementi definito==
+
 
 +
==Vettori di tipo ''Struttura'' con numero di elementi definito==
 
Possiamo dichiarare e creare variabili array di tipo ''Struttura'' con numero di elementi definito.  
 
Possiamo dichiarare e creare variabili array di tipo ''Struttura'' con numero di elementi definito.  
  
===1° esempio===
+
===Uso della parola-chiave "Struct"===
  '''Public''' Struct <Font Color= #B22222>strutturaModello</font>
+
Se, per dichiarare un array di Struttura, viene usata la parola-chiave "Struct", come sappiamo, tale dichiarazione dovrà essere posta al di fuori delle routine.
  prB As Byte
+
<BR>La parola-chiave "Struct" può essere utilizzata solo con array annidato del tipo della "Struttura".
  prI As Integer
+
  Public Struct <Font Color= #B22222>strutturaModello</font>
  '''End''' Struct
+
  prB As Byte
 +
  prI As Integer
 +
  End Struct
 
   
 
   
  <Font Color= #006400>' ''Dichiariamo la variabile della Struttura come array con numero di elementi definito.''
+
  <Font Color=gray>' ''Dichiariamo la variabile della Struttura come array con numero di elementi definito.''</font>
' ''In questo tipo di esempio sarà necessario inserire dopo "As" la parola "'''Struct'''":''</font>
+
Private <Font Color= #0000FF>strutturaVariabile[10]</font> As '''Struct''' <Font Color= #B22222>StrutturaModello</font>
  '''Private''' <Font Color= #0000FF>strutturaVariabile[10]</font> As '''Struct''' <Font Color= #B22222>StrutturaModello</font>
 
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Main()
 
   
 
   
 
   Dim a As Byte
 
   Dim a As Byte
 
   
 
   
  <Font Color= #006400>' ''Assegnamo i valori agli elementi della variabile array di tipo Struttura:''</font>
+
  <Font Color=gray>' ''Assegnamo i valori agli elementi della variabile array di tipo Struttura:''</font>
 
   For a = 0 To 9
 
   For a = 0 To 9
 
     With <Font Color= #0000FF>strutturaVariabile[a]</font>
 
     With <Font Color= #0000FF>strutturaVariabile[a]</font>
Riga 203: Riga 320:
 
     End With
 
     End With
 
   Next
 
   Next
 +
 
 
   
 
   
  '''End'''
+
  <Font Color=gray>' ''Andiamo a mostrare i risultati in console:''</font>
 
 
<Font Color= #006400>' ''Andiamo a mostrare i risultati in console:''</font>
 
'''Public''' Sub Button1_Click()
 
 
  Dim a As Byte
 
 
For a = 0 To 9
 
  With <Font Color= #0000FF>strutturaVariabile[a]</font>
 
    Print .prB
 
    Print .prI
 
  End With
 
Next
 
 
'''End'''
 
 
 
===2° esempio===
 
'''Public''' Struct <Font Color= #B22222>strutturaModello</font>
 
  prB As Byte
 
  prI As Integer
 
'''End''' Struct
 
 
<Font Color= #006400>' ''Dichiariamo la variabile della Struttura come array con numero di elementi definito.''
 
' ''In questo caso sarà necessario inserire dopo "As" la parola "'''New'''":''</font>
 
  '''Private''' <Font Color= #0000FF>strutturaVariabile</font> As '''New''' <Font Color= #B22222>StrutturaModello[10]</font>
 
 
 
'''Public''' Sub Form_Open()
 
 
Dim a As Byte
 
 
<Font Color= #006400>' ''Assegnamo i valori agli elementi della variabile array di tipo Struttura:''</font>
 
  For a = 0 To 9
 
 
    With <Font Color= #0000FF>strutturaVariabile[a]</font> = New <Font Color= #B22222>StrutturaModello</font>
 
      .prB = a
 
      .prI = 1000 + a
 
    End With
 
 
  Next
 
 
'''End'''
 
 
 
<Font Color= #006400>' ''Andiamo a mostrare i risultati in console:''</font>
 
'''Public''' Sub Button1_Click()
 
 
  Dim a As Byte
 
 
 
   For a = 0 To 9
 
   For a = 0 To 9
 
     With <Font Color= #0000FF>strutturaVariabile[a]</font>
 
     With <Font Color= #0000FF>strutturaVariabile[a]</font>
Riga 261: Riga 330:
 
   Next
 
   Next
 
   
 
   
  '''End'''
+
  End
  
 
+
===Uso della parola-chiave "New"===
==Variazione successiva del numero degli elementi==
+
Se, per dichiarare  un array di Struttura, si usa la parola-chiave "New", la dichiarazione potrà essere posta a seconda delle esigenze sia all'interno (per una variabile array "locale") che all'esterno (per una variabile array "Globale") delle routine.
E' possibile variare successivamente, anche in modo ricorsivo, il numero degli elementi di una variabile vettoriale (''array'') di tipo ''Struttura'', purché il numero dei suoi elementi, preliminarmente dichiarati, sia maggiore di zero.
+
  Public Struct <Font Color= #B22222>strutturaModello</font>
 
+
  prB As Byte
Nell'esempio che segue dichiariamo una variabile array di tipo ''Struttura'' con numero di elementi uguale a 3. Successivamente varieremo più volte detto numero portandolo complessivamente a 6:
+
  prI As Integer
  '''Public''' Struct esempio
+
  End Struct
  b As Byte
 
  i As Integer
 
  '''End''' Struct
 
 
   
 
   
<FONT color=#006400>' ''Viene dichiarata una variabile vettoriale (array) del tipo della "Struttura"''
 
' denominata "esempio", e contestualmente viene impostato ad esempio a 3 il numero iniziale degli elementi''
 
' che si provvederà a variare successivamente:</font>
 
'''Private''' eV As New Esempio[<FONT color=B22222>3</font>]
 
 
   
 
   
   
+
  Public Sub Main()
'''Public''' Sub Form_Open()
+
 
+
   Dim a As Byte
   Dim j, k As Byte
+
  <Font Color=Gray>' ''Dichiariamo la variabile della Struttura come array con numero di elementi definito.''</font>
+
  Dim <Font Color= #0000FF>strutturaVariabile</font> As '''New''' <Font Color= #B22222>StrutturaModello[10]</font>
  <FONT color=#006400>' ''Il ciclo imposta volta per volta,  incrementandolo, il valore del numero degli elementi''
+
    
' ''della variabile vettoriale di tipo "Struttura":</font>
+
  <Font Color=gray>' ''Assegnamo i valori agli elementi della variabile array di tipo Struttura:''</font>
  For k = 4 To 6
+
  For a = 0 To 9
+
    With <Font Color= #0000FF>strutturaVariabile[a]</font> = New <Font Color= #B22222>StrutturaModello</font>
    eV = New Esempio[k]
+
      .prB = a
+
      .prI = 1000 + a
   Next
+
    End With
+
  Next
  For j = 0 To eV.Max
 
  <FONT color=#006400>' ''Viene creata, quindi, la nuova variabile,''
 
' ''e vengono assegnati dei valori ai suoi campi:''</font>
 
      With eV[j] = New Esempio
 
        .b = j
 
        .i = j + 1
 
      End With
 
 
    
 
    
  Next
 
 
    
 
    
  <FONT color=#006400>' ''Si verifica il numero complessivo finale''
+
  <Font Color=gray>' ''Andiamo a mostrare i risultati in console:''</font>
' ''degli elementi della variabile vettoriale:''</font>
+
  For a = 0 To 9
  Print "eV.Count = "; eV.Count
+
    With <Font Color= #0000FF>strutturaVariabile[a]</font>
 +
      Print .prB
 +
      Print .prI
 +
    End With
 +
  Next
 
    
 
    
  '''End'''
+
  End
 +
Si potrà anche semplicemente dichiarare un array di tipo Struttura senza determinazione degli elementi, disponendo soltanto successivamente l'istanziazione e la correlata determinazione degli elementi:
 +
Public Struct <Font Color=red>strutturaModello</font>
 +
  membro1 As Byte
 +
  membro2 As Integer
 +
End Struct
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Main()
 
   
 
   
   Dim j As Byte
+
<FONT Color=gray>' ''Dichiara e dimensiona la variabile "OggettoStruttura" come un "Array" del tipo della Struttura "strutturaModello":''</font>
 +
   Dim <Font Color=blue>OggettoStruttura</font> As <Font Color=red>strutturaModello[]</font>
 
   
 
   
  <FONT color=#006400>' ''Si verifica quindi il valori contenuti dai campi''
+
  <FONT Color=gray>' ''Istanzia l'Oggetto-variabile "OggettoStruttura" come un "Array" del tipo della Struttura "strutturaModello", composto da otto elementi:''</font>
' ''di ciascuna variabile creata:''</font>
+
  <Font Color=blue>OggettoStruttura</font> = New <Font Color=red>strutturaModello['''8''']</font>
  For j = 0 To eV.Max
 
 
   
 
   
    With eV[j]
+
<FONT Color=gray>' ''Istanzia ogni Oggetto, del tipo della Struttura "strutturaModello", contenuto negli 8 elementi dell'array "OggettoStruttura":''</font>
      Print "b = "; .b
+
  For b As Byte = 0 To 7
      Print "i = "; .i
+
     <Font Color=blue>OggettoStruttura[b]</font> = New <Font Color=red>strutturaModello</font>
     End With
 
 
 
 
   Next
 
   Next
 
   
 
   
  '''End'''
+
  End
  
  
 
==Vettori con numero di elementi indefinito==
 
==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 semplice variabile di tipo ''Struttura''.
 
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 semplice variabile di tipo ''Struttura''.
 +
 +
Poiché, come si è avuto modo già di precisare, la dichiarazione di un vettore di tipo ''Struttura'' mediante la parola ''<SPAN style="text-decoration:underline">New</span>'' conferisce ''dinamicità'' alla variabile vettoriale medesima, si farà uso di tale parola per consentire l'incremento degli elementi della variabile vettoriale di tipo ''Struttura''.
  
 
Esempio:
 
Esempio:
  '''Public''' Struct <Font Color= #B22222>strutturaModello</font>
+
  Public Struct <Font Color= #B22222>strutturaModello</font>
  prB As Byte
+
  prB As Byte
  prI As Integer
+
  prI As Integer
  '''End''' Struct
+
  End Struct
 
   
 
   
<Font Color= #006400>' ''Dichiariamo la variabile della Struttura come array con numero di elementi indefinito.''
 
' ''In questo caso sarà necessario inserire dopo "As" la parola "'''New'''":''</font>
 
  '''Private''' <Font Color= #0000FF>prima</font> As '''New''' <Font Color= #B22222>StrutturaModello[]</font>
 
 
   
 
   
 +
Public Sub Main()
 
   
 
   
  '''Public''' Sub Form_Open()
+
  <Font Color=gray>' ''Dichiarao la variabile della Struttura come array con numero di elementi indefinito.''
 +
' ''In questo caso sarà necessario inserire dopo "As" la parola "'''New'''", poiché '''creiamo''' un Oggetto array del tipo della Struttura:''</font>
 +
  Dim <Font Color= #0000FF>prima</font> As '''New''' <Font Color= #B22222>StrutturaModello[]</font>
 +
  Dim a As Byte
 +
<Font Color=gray>' ''Dichiara un'altra variabile del tipo della Struttura modello:''</font>
 +
  Dim <Font Color= #1E90FF>seconda</font> As <Font Color= #B22222>StrutturaModello</font>
 
   
 
   
  Dim a As Byte
+
  <Font Color=gray>' ''Assegna i valori agli elementi della variabile normale di tipo Struttura:''</font>
+
  For a = 0 To 9
<Font Color= #006400>' ''Dichiariamo un'altra variabile del tipo della Struttura modello:''</font>
 
  Dim <Font Color= #1E90FF>seconda</font> As <Font Color= #B22222>StrutturaModello</font>
 
 
  <Font Color= #006400>' ''Assegnamo i valori agli elementi della variabile normale di tipo Struttura:''</font>
 
  For a = 0 To 9
 
 
   
 
   
 
  <Font Color= #006400>' '''''Va prevista ovviamente la creazione di ogni variabile di tipo Struttura:'''''</font>
 
  <Font Color= #006400>' '''''Va prevista ovviamente la creazione di ogni variabile di tipo Struttura:'''''</font>
    <Font Color= #1E90FF>seconda</font> = New <Font Color= #B22222>StrutturaModello</font>
+
    <Font Color= #1E90FF>seconda</font> = New <Font Color= #B22222>StrutturaModello</font>
 
   
 
   
    With <Font Color= #1E90FF>seconda</font>
+
    With <Font Color= #1E90FF>seconda</font>
 
       .prB = a
 
       .prB = a
 
       .prI = 1000 + a
 
       .prI = 1000 + a
    End With
+
    End With
 
   
 
   
 
  <Font Color= #006400>' ''La variabile Struttura array vuole una variabile Struttura (non array) del tipo "StrutturaModello":''</font>
 
  <Font Color= #006400>' ''La variabile Struttura array vuole una variabile Struttura (non array) del tipo "StrutturaModello":''</font>
    <Font Color= #0000FF>prima</font>.Add(<Font Color= #1E90FF>seconda</font>)
+
    <Font Color= #0000FF>prima</font>.Add(<Font Color= #1E90FF>seconda</font>)
 
   
 
   
  Next
+
  Next
 
   
 
   
'''End'''
 
 
 
<Font Color= #006400>' ''Andiamo a mostrare i risultati in console:''</font>
 
'''Public''' Sub Button1_Click()
 
 
  Dim a As Byte
 
 
   
 
   
 +
<Font Color=gray>' ''Mostra i risultati in console:''</font>
 
   For a = 0 To 9
 
   For a = 0 To 9
 
     With <Font Color= #0000FF>prima[a]</font>
 
     With <Font Color= #0000FF>prima[a]</font>
Riga 378: Riga 433:
 
   Next
 
   Next
 
   
 
   
  '''End'''
+
  End
  
  
==Impostazione successiva del numero di elementi==
+
=Strutture che contengono variabili vettoriali di tipo ''Struttura''=
E' possibile impostare successivamente il numero di elementi di una variabile vettoriale dichiarata priva di un numero definito di elementi.
+
Le ''Strutture'' possono contenere membri rappresentati da variabili vettoriali (''array'' ), o anche matrici, di tipo ''Struttura''. Gli elementi di tali variabili vettoriali, o matrici, possono essere sia definiti che indefiniti, e dunque in quest'ultimo caso incrementabili nelle modalità viste nel paragrafo precedente.
 +
<BR>In ogni caso la sintassi seguirà le forme viste in precedenza.
  
Nell'esempio che segue dichiariamo una variabile array di tipo ''Struttura'' senza definire preventivamente il numero dei suoi elementi. Esso verrà impostato solo successivamente portandolo complessivamente a 6:
+
 
  '''Public''' Struct esempio
+
==Variabile vettoriale di tipo ''Struttura'' con numero di elementi definito==
  b As Byte
+
Nel caso in cui la ''Struttura'' contenga uno o più membri rappresentati da variabili vettoriali di tipo ''Struttura'' con numero di elementi definito, si procederà nel seguente modo:
  i As Integer
+
Public Struct <FONT color=Red>Struttura_Secondaria</font>
  '''End''' Struct
+
  a As Byte
 +
  b As Integer
 +
End Struct
 +
 
 +
 +
  <FONT color=gray>' ''Quindi la "Struttura" sarà rappresentata all'interno della Struttura principale''
 +
' ''dalla sua relativa variabile vettoriale, denominata "str_sec", usando le parole "As Struct":''</font>
 +
Public Struct <FONT color=Blue>Struttura_Principale</font>
 +
  primo_membro As Integer
 +
  secondo_membro As Integer
 +
  <FONT color=gray>' ''Dichiara mediante la parola "Struct" la variabile vettoriale di tipo della Struttura denominata "Struttura_Secondaria".''
 +
' ''La variabile vettoriale di tipo Struttura, membro di una Struttura principale e avente un numero definito di elementi deve essere "annidata".''</font>
 +
  <FONT color=Green>str_sec['''n''']</font> As Struct <FONT color=Red>Struttura_Secondaria</font>
 +
End Struct
 +
 
 +
 
 +
====Esempio pratico====
 +
Public Struct Struttura_Secondaria
 +
  a As Byte
 +
  b As Integer
 +
End Struct
 +
 
   
 
   
  <FONT color=#006400>' ''Viene dichiarata una variabile vettoriale (array) del tipo della "Struttura"''
+
  Public Struct Struttura_Principale
' denominata "esempio", e contestualmente viene impostato ad esempio a 3 il numero iniziale degli elementi''
+
  primo_membro As Integer
' che si provvederà a variare successivamente:</font>
+
  secondo_membro As Integer
'''Private''' eV As Esempio<FONT color=B22222>[]</font>
+
  str_sec[3] As Struct Struttura_Secondaria
 +
End Struct
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Main()
 
   
 
   
   Dim j, k As Byte
+
   Dim sp As New Struttura_Principale
 
   
 
   
<FONT color=#006400>' ''Il ciclo imposta volta per volta, incrementadolo sino al valore stabilito,
+
  sp.str_sec[0].a = 9
''il numero degli elementi della variabile vettoriale di tipo "Struttura":</font>
+
  sp.str_sec[1].a = 10
  For k = 1 To 6
+
   
 +
  Print sp.str_sec[0].a
 +
  Print sp.str_sec[1].a
 
   
 
   
  <FONT color=#006400>' ''Viene variato il numero degli elementi della variabile vettoriale''
+
  End
' ''del tipo della Struttura denominata "esempio":''</font>
+
 
    eV = New Esempio[k]
+
 
 +
==Variabile vettoriale di tipo ''Struttura'' con numero di elementi indefinito==
 +
Nel caso in cui la ''Struttura'' contenga uno o più membri rappresentati da variabili vettoriali di tipo ''Struttura'' con numero di elementi non definito, si procederà nel seguente modo:
 +
Public Struct <FONT color=Red>Struttura_Secondaria</font>
 +
  a As Byte
 +
  b As Integer
 +
End Struct
 
   
 
   
  Next
 
 
   
 
   
  For j = 0 To eV.Max
+
  <FONT color=gray>' ''Quindi la "Struttura" sarà rappresentata all'interno della Struttura principale dalla sua relativa variabile vettoriale, denominata "str_sec":''</font>
  <FONT color=#006400>' ''Viene creata, quindi, la nuova variabile,''
+
Public Struct <FONT color=Blue>Struttura_Principale</font>
' ''e vengono assegnati dei valori ai suoi campi:''</font>
+
  primo_membro As Integer
      With eV[j] = New Esempio
+
   secondo_membro As Integer
        .b = j
+
  <FONT color=gray>' ''Dichiara la variabile vettoriale di tipo della Struttura denominata "Struttura_Secondaria[]":''</font>
        .i = j + 1
+
   <FONT color=Green>str_sec</font> As <FONT color=Red>Struttura_Secondaria[]</font>
      End With
+
End Struct
 
+
 
   Next
+
 
 
+
====Esempio pratico====
  <FONT color=#006400>' ''Si verifica il numero complessivo finale''
+
Public Struct Struttura_Secondaria
' ''degli elementi della variabile vettoriale:''</font>
+
  a As Byte
   Print "eV.Count = "; eV.Count
+
  b As Integer
 
+
  End Struct
  '''End'''
 
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Struct Struttura_Principale
 +
  primo_membro As Integer
 +
  secondo_membro As Integer
 +
  str_sec As Struttura_Secondaria[]
 +
End Struct
 
   
 
   
  Dim j As Byte
 
 
   
 
   
  <FONT color=#006400>' ''Si verifica quindi il valori contenuti dai campi''
+
  Public Sub Main()
' ''di ciascuna variabile creata:''</font>
 
  For j = 0 To eV.Max
 
 
   
 
   
    With eV[j]
+
  Dim sp As New Struttura_Principale
      Print "b = "; .b
+
  Dim ss As Struttura_Secondaria
       Print "i = "; .i
+
  Dim i As Integer
 +
 
 +
  sp.str_sec = New Struttura_Secondaria[]
 +
 
 +
  For i = 1 To 8
 +
    With ss = New Struttura_Secondaria
 +
       .a = i * 10
 
     End With
 
     End With
 +
    sp.str_sec.Push(ss)
 +
  Next
 
    
 
    
 +
  For i = 0 To 7
 +
    Print sp.str_sec[i].a,
 
   Next
 
   Next
   
+
 
'''End'''
+
  End
 +
 
 +
 
 +
 
 +
=Note=
 +
[1] Vedasi anche la seguente sezione della Wiki: [https://www.gambas-it.org/wiki/index.php?title=Guide_della_comunit%C3%A0#Strutture Strutture]
 +
 
 +
[2] In ordine all'uso delle ''Strutture'' in Gambas, [https://it.wikipedia.org/wiki/Beno%C3%AEt_Minisini Benoît Minisini] afferma che le ''Strutture'' esistono per permettere a Gambas di dialogare con le librerie C.
 +
<BR>Quando Gambas al suo interno crea un Oggetto di tipo ''Struttura'', esso crea una Classe; pertanto, affinché Gambas non compia un doppio lavoro, al posto di una ''Struttura'' è meglio usare direttamente una Classe.
 +
<BR>
 +
 
 +
[3] E' appena il caso di ricordare che il passaggio di valori "''per Indirizzo'' " a una sotto-procedura/funzione, non crea una copia dell'Oggetto, o comunque del tipo, passato, come avviene invece nel passaggio "''per Valore'' ", ove si va ad occupare un'altra area di memoria (per generare la copia) di dimensioni pari a quella occupata dall'Oggetto (o dal tipo di valore) passato.
 +
<BR>Va da sé che con il passaggio "''per Valore'' ", avendo due copie uguali, avremo due indirizzi di memoria che si riferiscono ovviamente a due aree di memoria riservate automaticamente di uguale dimensione, ...e quindi un consumo doppio delle risorse (ossia della memoria necessaria per il passaggio dei dati).
 +
<BR>Il passaggio "''per Indirizzo'' " fa in modo che la modifica avvenga direttamente all'<U>indirizzo di memoria</u> dell'Oggetto (o del tipo di valore) passato evitando così la creazione di una copia e l'occupazione di altra memoria per il medesimo dato da passare.

Versione attuale delle 03:22, 12 ott 2024

La Struttura [nota 1] similmente al vettore (Array) aggrega due o più elementi. Però, mentre il vettore 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 Gambas la Struttura può essere considerata una "Classe" priva di Metodi e di Eventi, che, come nel C, definisce e si riserva una porzione di memoria. Più precisamente la Struttura in Gambas è semplicemente una Classe senza Proprietà, Metodi ed Eventi, ed essendo dichiarabile esclusivamente Pubblica, conseguentemente i suoi membri sono "Pubblici". [nota 2]

La Struttura, variabile strutturata di reminescenza del C, è un "tipo derivato " che aggrega elementi di tipo diverso. Ci si serve di essa, qualora si abbia necessità di utilizzare un'area riservata di memoria di tipi di dati non omogenei.


Dichiarazione di una Struttura

La Struttura va dichiarata sempre con la parola chiave Public :

Public Struct Nome_della_Struttura
  nome_membro1 As tipo
  nome_membro2 As tipo
  etc....
End Struct

laddove:

  • Struct è la parola-chiave che introduce alla dichiarazione della Struttura;
  • Nome_della_Struttura è l'etichetta che attribuisce un nome alla dichiarazione della Struttura;
  • nome_membro1 e nome_membro2 sono le variabili della Struttura destinate a ricevere ciascuna un valore (in base al proprio tipo di dati di appartenenza);
  • tipo è il tipo di dati (Byte, Short, Integer, etc.), al quale il membro della Struttura appartiene.

La dichiarazione della Struttura termina sempre con le parole-chiave End Struct .

Esempio astratto

Mostriamo un esempio astratto, nel quale dichiariamo una Struttura con dei membri, 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.
La Struttura modello avrà il nome: NomeStruttura, mentre la variabile del tipo di quella Struttura la chiameremo: variabileStruttura:

Public Struct NomeStruttura
' definiamo i membri della Struttura "modello".
' Questa Struttura si riserverà, occupandola, 8 byte di memoria in tutto:
  valore1 As Byte     ' Occupa 1 byte + un altro in questo caso per l'allineamento (byte di indici 0 e 1) 
  valore2 As Short    ' Occupa 2 byte: da quello di indice 2 a quello di indice 3
  valore3 as Integer  ' Occupa 4 byte: da quello di indice 4 a quello di indice 7
End Struct

' Possiamo ovviamente dichiarare la variabile di tipo Struttura come "Globale":
' Private variabileStruttura As New NomeStruttura


Public Sub Main()
  
' Dichiariamo in questo semplice esempio la variabile di tipo "Struttura" come "locale":
 Dim variabileStruttura As New NomeStruttura

' Attribuiamo un valore a ciascun membro della variabile di tipo Struttura nel rispetto del proprio tipo di dati:
 variabileStruttura.valore1 = 4
 variabileStruttura.valore2 = 444
 variabileStruttura.valore3 = 44444

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

End


Dichiarazione e creazione delle variabili di tipo Struttura

La dichiarazione e la creazione di una variabile di tipo Struttura può richiedere l'uso della parola-chiave New.
Con l'uso della parola-chiave "New " viene creato l'Oggetto (ossia la variabile) del tipo della Classe Struttura dichiarata dall'utente.

L'uso della parola-chiave "New" in fase di dichiarazione della variabile di tipo Struttura è richiesto, quando vi è l'assegnazione diretta di un dato ad uno o più membri della Struttura all'interno di una routine, e, quindi, anche quando si deve passare a una funzione una variabile di tipo Struttura.

Esempio:

Public Struct STRUTTURA
  b As Byte
  s As Short
End Struct


Public Sub Main()

 Dim sr As New STRUTTURA
 
' Assegnazione diretta di un valore a un membro nella routine:
 sr.s = 999

' Passaggio per "indirizzo" della variabile di tipo Struttura ad una funzione:
 Prova(sr)
 
 Print sr.b
  
End


Private Function Prova(t as STRUTTURA)
 
' Assegnazione diretta di un valore a un membro nella routine della funzione:
 t.b = 99
    
End

Non è invece richiesto nella routine principale, quando alla variabile deve essere assegnata una Struttura quale ritorno di una Funzione, nella quale è stata creata.
Dunque non sarà necessaria la parola-chiave "New" in una routine principale, qualora la variabile del tipo della Struttura, dichiarata e creata in una Funzione o in una Procedura, venga restituita alla routine principale che ha invocato la Funzione o la Procedura.

Esempio:

Public Struct STRUTTURA
  b As Byte
  s As Short
End Struct


Public Sub Main()

 Dim sr As STRUTTURA     ' Qui non serve la parola-chiave "New", perché la variabile Struttura sarà istanziata nella Funzione chiamata !
 
' La Funzione invocata restituisce una Struttura istanziata nella Funzione medesima:
 sr = Prova(9, 199)
 
 Print sr.b
 Print sr.s
 
End


Private Function Prova(vlb As Byte, vlc As Short) As STRUTTURA   ' La Funzione restituisce la Struttura
 
 Dim tt As New STRUTTURA   ' Crea la variabile del tipo della Struttura dichiarata all'inizio (Struct "STRUTTURA")
  
 tt.b = vlb * 10
 tt.s = vlc * 100
  
 Return tt
  
End

Uso della parola-chiave "Struct"

E' possibile anche usare la parola-chiave "Struct", ma solo per la dichiarazione di una variabile globale di tipo della "Struttura" di riferimento.

Public Struct STRUTTURA
  b As Byte
  c As Short
End Struct

Private variabileStruttura As Struct STRUTTURA

Public Sub Main()

......

Questa parola-chiave incorpora una "Struttura" direttamente all'interno di una variabile o di un'altra Struttura, come fa C per impostazione predefinita. Quindi il contenuto della "Struttura" viene incorporato nell'Oggetto in cui è dichiarato. Di conseguenza, per usarlo come ogni altro Oggetto, Gambas deve creare un Oggetto temporaneo. Ciò lo rende più lento rispetto all'utilizzo di un Oggetto reale.


Passaggio di una Struttura a una Funzione

Una variabile di tipo Struttura può senz'altro essere passata (e ritornata) "per Valore" a una Funzione o a una Procedura; ma, poiché tale variabile è in sostanza un Puntatore, contenente l'indirizzo di memoria della Struttura, sarà più opportuno e più adeguato passarla "per Indirizzo" (analogamente a quanto avviene con gli array): [nota 3]

Public Struct STRUTTURA
  b As Byte
  c As Short
End Struct


Public Sub Main()
 
 Dim sr as New STRUTTURA
 
 sr.b = 10
 sr.c = 100
  
 Funzione(sr)   ' La variabile di tipo Struttura viene passata per "Indirizzo"
  
 Print sr.b
 Print sr.c
  
End


Private Function Funzione(sra As STRUTTURA)
 
 sra.b *= 10
 sra.c *= 10
  
End


Strutture contenenti Vettori e Matrici

Le Strutture possono essere costituite da membri di variabili vettoriali (Array ) e Matrici annidate.
Se il membro è di tipo array di numero di elementi non definito, dovrà essere istanziato opportunamente con la parola-chiave "NEW".

Esempio:

Public Struct StrutturaModello
  mt110] As Byte       ' array monodimensionale annidato definito
  arI As Integer[]      ' array monodimensionale non definito
  mt2[10, 4] As Byte     ' matrice annidata
End Struct
 

Public Sub Form_Open()
 
 Dim variabileStruttura As New StrutturaModello ' Crea l'Oggetto del tipo della Struttura dichiarata
 Dim a, m As Byte

' Crea l'Oggetto del tipo vettore "Intero" del membro della Struttura dichiarata:
 variabileStruttura.arI = New Integer[]

' Assegna dei valori a ciascun membro della "Struttura":
 For a = 0 To 9
   With variabileStruttura
     .mt1[a] = a
     .arI.Push(a)
     For m = 0 To 3
       .mt2[a, m] = a + 1
     Next
   End With
 Next
 
' Verifica i valori assegnati a ciascun membro della "Struttura":
 With variabileStruttura
   Print "mt1"
   For a = 0 To 9
     Print .mt1[a]
   Next
   Print
   Print
   Print "arI"
   For a = 0 To 9
     Print .arI[a]
   Next 
   Print
   Print
   Print "mt2"
   For a = 0 To 9
     For m = 0 To 3
       Print .mt2[a, m]
     Next 
   Next 
   Print 
 End With

End


Strutture che contengono altre Strutture

Le Strutture possono contenere, come proprio membro, altre Strutture. In tal caso la Struttura principale è chiamata "Struttura innestata", mentre quella richiamata nel membro della Struttura principale è chiamata "Struttura innesto". Da tenere presente che è necessario dichiarare e definire la Struttura "innesto", che sarà contenuta nella Struttura principale, prima della dichiarazione della Struttura principale contenente.

Esempio:

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


' ...poi va dichiarata la Struttura principale "innestata", ossia quella che conterrà la Struttura "innesto".
' In un suo membro verrà dichiarata la variabile di tipo della Struttura "innesto" (che si intende appunto contenere in quella principale):
Public Struct StrutturaPrincipale
  prB As Byte
  prI As Integer
  innestoStru As Struct strutturaInnesto ' oppure più semplicemente: innestoStru As strutturaInnesto
End Struct


Public Sub Main()

 Dim struttVariab As New StrutturaPrincipale
 Dim a As Byte

 a = 1

' Assegniamo i valori alle variabili contenute nei membri della variabile Struttura principale:
 With struttVariab
   .prB = 10
   .prI = 1000
   .innestoStru.sb = a
   .innestoStru.sI = struttVariab.prI + a
   .innestoStru.s$ = "prova " & Str(a)
 End With
 
' Mostra i risultati in console:
 With struttVariab
   Print .prB
   Print .prI
   Print .innestoStru.sb
   Print .innestoStru.sI
   Print .innestoStru.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".

La dichiarazione di variabili vettoriali di tipo Struttura può avvenire:
- mediante la parola Struct. Tale dichiarazione è Statica;
- mediante la parola New. Tale dichiarazione è Dinamica.


Vettori di tipo Struttura con numero di elementi definito

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

Uso della parola-chiave "Struct"

Se, per dichiarare un array di Struttura, viene usata la parola-chiave "Struct", come sappiamo, tale dichiarazione dovrà essere posta al di fuori delle routine.
La parola-chiave "Struct" può essere utilizzata solo con array annidato del tipo della "Struttura".

Public Struct strutturaModello
  prB As Byte
  prI As Integer
End Struct

' Dichiariamo la variabile della Struttura come array con numero di elementi definito.
Private strutturaVariabile[10] As Struct StrutturaModello


Public Sub Main()

 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
 

' Andiamo a mostrare i risultati in console:
 For a = 0 To 9
   With strutturaVariabile[a]
     Print .prB
     Print .prI
   End With
 Next

End

Uso della parola-chiave "New"

Se, per dichiarare un array di Struttura, si usa la parola-chiave "New", la dichiarazione potrà essere posta a seconda delle esigenze sia all'interno (per una variabile array "locale") che all'esterno (per una variabile array "Globale") delle routine.

Public Struct strutturaModello
  prB As Byte
  prI As Integer
End Struct


Public Sub Main()
 
 Dim a As Byte
' Dichiariamo la variabile della Struttura come array con numero di elementi definito.
 Dim strutturaVariabile As New StrutturaModello[10]
  
' Assegnamo i valori agli elementi della variabile array di tipo Struttura:
 For a = 0 To 9
   With strutturaVariabile[a] = New StrutturaModello
     .prB = a
     .prI = 1000 + a
   End With
 Next
 
 
' Andiamo a mostrare i risultati in console:
 For a = 0 To 9
   With strutturaVariabile[a]
     Print .prB
     Print .prI
   End With
 Next
 
End

Si potrà anche semplicemente dichiarare un array di tipo Struttura senza determinazione degli elementi, disponendo soltanto successivamente l'istanziazione e la correlata determinazione degli elementi:

Public Struct strutturaModello
  membro1 As Byte
  membro2 As Integer
End Struct


Public Sub Main()

' Dichiara e dimensiona la variabile "OggettoStruttura" come un "Array" del tipo della Struttura "strutturaModello":
 Dim OggettoStruttura As strutturaModello[]

' Istanzia l'Oggetto-variabile "OggettoStruttura" come un "Array" del tipo della Struttura "strutturaModello", composto da otto elementi:
 OggettoStruttura = New strutturaModello[8]

' Istanzia ogni Oggetto, del tipo della Struttura "strutturaModello", contenuto negli 8 elementi dell'array "OggettoStruttura":
 For b As Byte = 0 To 7
   OggettoStruttura[b] = New strutturaModello
 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 semplice variabile di tipo Struttura.

Poiché, come si è avuto modo già di precisare, la dichiarazione di un vettore di tipo Struttura mediante la parola New conferisce dinamicità alla variabile vettoriale medesima, si farà uso di tale parola per consentire l'incremento degli elementi della variabile vettoriale di tipo Struttura.

Esempio:

Public Struct strutturaModello
  prB As Byte
  prI As Integer
End Struct


Public Sub Main()

' Dichiarao la variabile della Struttura come array con numero di elementi indefinito.
' In questo caso sarà necessario inserire dopo "As" la parola "New", poiché creiamo un Oggetto array del tipo della Struttura:
 Dim prima As New StrutturaModello[]
 Dim a As Byte
' Dichiara un'altra variabile del tipo della Struttura modello:
 Dim seconda As StrutturaModello

' Assegna 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


' Mostra i risultati in console:
 For a = 0 To 9
   With prima[a]
     Print .prB
     Print .prI
   End With
  Next

End


Strutture che contengono variabili vettoriali di tipo Struttura

Le Strutture possono contenere membri rappresentati da variabili vettoriali (array ), o anche matrici, di tipo Struttura. Gli elementi di tali variabili vettoriali, o matrici, possono essere sia definiti che indefiniti, e dunque in quest'ultimo caso incrementabili nelle modalità viste nel paragrafo precedente.
In ogni caso la sintassi seguirà le forme viste in precedenza.


Variabile vettoriale di tipo Struttura con numero di elementi definito

Nel caso in cui la Struttura contenga uno o più membri rappresentati da variabili vettoriali di tipo Struttura con numero di elementi definito, si procederà nel seguente modo:

Public Struct Struttura_Secondaria
  a As Byte
  b As Integer
End Struct
 

' Quindi la "Struttura" sarà rappresentata all'interno della Struttura principale
' dalla sua relativa variabile vettoriale, denominata "str_sec", usando le parole "As Struct":
Public Struct Struttura_Principale
  primo_membro As Integer
  secondo_membro As Integer
' Dichiara mediante la parola "Struct" la variabile vettoriale di tipo della Struttura denominata "Struttura_Secondaria".
' La variabile vettoriale di tipo Struttura, membro di una Struttura principale e avente un numero definito di elementi deve essere "annidata".
  str_sec[n] As Struct Struttura_Secondaria
End Struct


Esempio pratico

Public Struct Struttura_Secondaria
  a As Byte
  b As Integer
End Struct


Public Struct Struttura_Principale
  primo_membro As Integer
  secondo_membro As Integer
  str_sec[3] As Struct Struttura_Secondaria
End Struct


Public Sub Main()

 Dim sp As New Struttura_Principale

 sp.str_sec[0].a = 9
 sp.str_sec[1].a = 10
   
 Print sp.str_sec[0].a
 Print sp.str_sec[1].a

End


Variabile vettoriale di tipo Struttura con numero di elementi indefinito

Nel caso in cui la Struttura contenga uno o più membri rappresentati da variabili vettoriali di tipo Struttura con numero di elementi non definito, si procederà nel seguente modo:

Public Struct Struttura_Secondaria
  a As Byte
  b As Integer
End Struct


' Quindi la "Struttura" sarà rappresentata all'interno della Struttura principale dalla sua relativa variabile vettoriale, denominata "str_sec":
Public Struct Struttura_Principale
  primo_membro As Integer
  secondo_membro As Integer
' Dichiara la variabile vettoriale di tipo della Struttura denominata "Struttura_Secondaria[]":
  str_sec As Struttura_Secondaria[]
End Struct


Esempio pratico

Public Struct Struttura_Secondaria
  a As Byte
  b As Integer
End Struct


Public Struct Struttura_Principale
  primo_membro As Integer
  secondo_membro As Integer
  str_sec As Struttura_Secondaria[]
End Struct


Public Sub Main()

 Dim sp As New Struttura_Principale
 Dim ss As Struttura_Secondaria
 Dim i As Integer
 
 sp.str_sec = New Struttura_Secondaria[]
 
 For i = 1 To 8
   With ss = New Struttura_Secondaria
     .a = i * 10
   End With
   sp.str_sec.Push(ss)
 Next
 
 For i = 0 To 7
   Print sp.str_sec[i].a,
 Next
 
End


Note

[1] Vedasi anche la seguente sezione della Wiki: Strutture

[2] In ordine all'uso delle Strutture in Gambas, Benoît Minisini afferma che le Strutture esistono per permettere a Gambas di dialogare con le librerie C.
Quando Gambas al suo interno crea un Oggetto di tipo Struttura, esso crea una Classe; pertanto, affinché Gambas non compia un doppio lavoro, al posto di una Struttura è meglio usare direttamente una Classe.

[3] E' appena il caso di ricordare che il passaggio di valori "per Indirizzo " a una sotto-procedura/funzione, non crea una copia dell'Oggetto, o comunque del tipo, passato, come avviene invece nel passaggio "per Valore ", ove si va ad occupare un'altra area di memoria (per generare la copia) di dimensioni pari a quella occupata dall'Oggetto (o dal tipo di valore) passato.
Va da sé che con il passaggio "per Valore ", avendo due copie uguali, avremo due indirizzi di memoria che si riferiscono ovviamente a due aree di memoria riservate automaticamente di uguale dimensione, ...e quindi un consumo doppio delle risorse (ossia della memoria necessaria per il passaggio dei dati).
Il passaggio "per Indirizzo " fa in modo che la modifica avvenga direttamente all'indirizzo di memoria dell'Oggetto (o del tipo di valore) passato evitando così la creazione di una copia e l'occupazione di altra memoria per il medesimo dato da passare.