Le strutture non esistono in Gambas2 ma sono state introdotte (o lo saranno) in Gambas3....
Ecco, vorrei sapere se le Strutture sono state, quindi, introdotte ora in Gambas 3.
In caso positivo, come fare per gestirle ?
ah... solo oggi ho visto per Gambas 3 l'argomento " Dichiarazione di struttura ":
PUBLIC STRUCT Identificatore
Campo1 [ DichiaraArrayIncorporato ] AS [ TipoDato ]
Campo2 [ DichiaraArrayIncorporato ] AS [ TipoDato ]
.
.
.
Campo n [ DichiaraArrayIncorporato ] AS [ TipoDato ]
END STRUCT
...va be' !
Dalle poche prove che ho fatto, sembrano comportarsi similarmente agli oggetti, tranne per il fatto che si presentano come template di una aggrezione di dati di tipo di verso (come del resto la structura è...).
.........
L'utilizzo è uguale a quello di una comune classe, basta un semplice NEW per crearti la tua struttura e assegnarla ad una tua variabile.
Ho fatto una piccola prova:
' Gambas-3 class file
PUBLIC Struct NomeStruttura ' definisco i campi della Struttura "astratta"
' Questa Struttura si riserverà, occupandola, 9 byte di memoria in tutto:
valore1 As Integer ' 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
' creo una struttura "reale" composta a perfetta immagine di quella astratta;
' insomma una variabile del tipo della Struttura:
Private nuovaStruttura As New NomeStruttura
PUBLIC Sub valori_nuova_struttura()
Dim variabValor as Byte
variabValor = inputbox("Immetto un valore per *riempire* il campo *variabile* di 'nuovaStruttura': valore3 .")
' attribuisco il valore a ciascun campo variabile della variabile-struttura
' (qui i valori sono due "costanti" ed uno "variabile")
nuovaStruttura.valore1 = 3
nuovaStruttura.valore2 = 6
nuovaStruttura.valore3 = variabValor
END
PUBLIC Sub Button1_Click()
' quindi opero con i valori contenuti da "nuovaStruttura",
' ad esempio li faccio mostrare in console:
With nuovaStruttura
Print .valore1
Print .valore2
Print .valore3
End With
END
Quando premo il tasto button1, nella console mi compaiono coerentemente i numeri 3, 6 ed il valore immesso con InputBox......... e va be'....
Non mi risulta ben chiaro cosa vuoi fare
Solo un ragionamento teorico, diciamo accademico, per capire meglio.
1) in effetti non puoi dichiarare una struttura come array
2) ......
3) puoi dichiarare una tua variabile come un array di elementi di tipo "struttura", come hai tu fatto
Probabilmente mi sono espresso in modo non tecnico :-X
Ad ogni modo lo scopo sostanziale era quello di avere, appunto, tante Variabili array di tipo Struttura, che poi sono quelle concretamente utilizzabili. No ? ;)
Ho fatto un altro esperimento cercando di risolvere la tua proposta di prima ( PRIVATE $var AS STRUCT MyStruct[] ):
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" (e non Struct):
Private prima As New StrutturaModello[]
' Dichiariamo un'altra variabile simile alla Struttura modello:
Private seconda As New StrutturaModello
Public Sub Form_Open()
Dim a As Byte
prima = New StrutturaModello[]
' Assegnamo i valori agli elementi della variabile 'non' array di tipo Struttura:
For a = 0 To 9
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
A parte il motivo di creare due volte l'array (fuori metodo e entro metodo), l'esempio mi pare corretto.
Sul punto 2 del mio post:
Public Struct strutturaModello
prB As Byte [10]
prI As Integer [10]
End Struct
diciamo un'altro modo per creare una struttura, anche se poco dinamico...
Mi riferisco al fatto che nella dichiarazione esterna viene usato il NEW, come anche la RIdichiarazione interna alla funzione (sempre NEW).
Non che provochi qualcosa di anomalo, solo che si tenta di allocare due volte la stessa variabile inutilmente.
Di solito le strade sono due:
1) nella dichiarazione di proprietà di una classe, viene effettuata anche la sua inizializzazione
2) l'inizializzazione viene fatta dal metodo creatore della classe _new()
Ummm...quanto rilevi e quanto suggerisci è molto utile, grazie.
Volendo seguire la prima soluzione correttiva, è coerente questa modifica che appresso riporto ?
Public Struct strutturaModello
prB As Byte
prI As Integer
End Struct
Private prima As StrutturaModello[] = New StrutturaModello[] '' <------------------|
Public Sub Form_Open()
Dim a As Byte
Dim seconda As StrutturaModello
For a = 0 To 9
seconda = New StrutturaModello
With seconda
.prB = a
.prI = 1000 + a
End With
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
Facendo la prova pratica, il codice funziona.
La sintassi:
Private prima As StrutturaModello[] = New StrutturaModello[]
può essere scritta pure come l'avevi fatto prima
Private prima As New StrutturaModello[]
Hai invece acquisito il discorso di eliminare l'inizializzazione doppia entro il metodo.
La sintassi:
Private prima As StrutturaModello[] = New StrutturaModello[]
può essere scritta pure come l'avevi fatto prima
Private prima As New StrutturaModello[]
Sì, cavolo ! Come ho fatto a non pensarci ?! :hatecomputer: ......merito di essere trascinato negli inferi da Ceskho: http://www.gambas-it.org/smf/index.php?topic=2130.msg23526#msg23526 !
Public Struct strutturaModello
prB As Byte
prI As Integer
End Struct
Private prima As New StrutturaModello[]
Public Sub Form_Open()
Dim a As Byte
Dim seconda As StrutturaModello
For a = 0 To 9
seconda = New StrutturaModello
With seconda
.prB = a
etc etc etc
...ed infatti il codice funziona anche più semplicemente così.
Hai invece acquisito il discorso di eliminare l'inizializzazione doppia entro il metodo.
Non si finisce mai di imparare.