Dichiarazione di struttura
PUBLIC STRUCT Identificatore
Campo 1 AS [ Tipo di dato ]
Campo 2 AS [ Tipo di dato ]
.
.
.
Campo n AS [ Tipo di dato ]
END STRUCT
Questa parola chiave dichiara una struttura.
Internamente, una struttura è esattamente come una classe che contiene al suo interno solo variabili pubbliche;
ma che puoi dichiarare come strutture incorporate o matrici di strutture incorporate, come spiegato di seguito.
Quando si utilizzano strutture incorporate o matrici di strutture incorporate, l'interprete deve creare
oggetti temporanei in modo da poterli manipolare come oggetti reali. E questo è più lento!
Di conseguenza,
NON USARE STRUTTURE, A MENO CHE TU NON LO DEBBA FARE! Ad esempio, per comunicare con una
funzione di libreria C condivisa che richiede strutture in C.
Se dichiari la stessa struttura in due classi diverse, le strutture devono avere esattamente gli stessi campi,
altrimenti l'interprete genererà un errore.
Array incorporati
Nelle strutture puoi utilizzare array incorporati.
PUBLIC STRUCT Identificatore
...
Campo k [ Dichiarazione di array incorporato ] AS [ Tipo di dato ]
...
END STRUCT
Allineamento dei campi:
Le strutture non sono compattate, per esempio i campi sono allineati in un idirizzo di memoria che è un multiplo della sua lunghezza nella memoria stessa:
-
Un booleano (Boolean) o un Byte può essere memorizzato in un indirizzo di memoria.
-
Un intero corto (Short) è memorizzato anch'esso in un'indirizzo di memoria.
-
Un intero (Integer) è memorizzato in un'idirizzo che è un multiplo di quattro.
-
...e così via.
L'ordine delle dichiarazioni è rispettato, conseguentemente è possibile che la struttura abbia dei buchi di memoria non utilizzati.
Per esempio, se dichiarate un campo byte e subito dopo un campo intero avrete un buco di tre bytes.
Attenzione! Vi è poi un problema: quando si compila il codice sorgente in C, il compilatore C potrebbe riordinare i campi della struttura.
E, per quanto se ne sa, questo processo non è ben documentato.
Una soluzione potrebbe essere in futuro l'utilizzo della libreria libffi usata da Gambas.
A quanto pare, questa libreria può inviare una struttura ad una funzione C prendendo in considerazione questo problema. Ma questa
libreria è molto meno documentata da Gambas, per poter vedere le difficoltà!
Strutture incorporate:
Una struttura può essere incorporata all'interno di una classe (classe) o in un'altra struttura, dichiarando una variabile con la seguente sintassi:
[ PRIVATE | PUBLIC ] Identificatore AS STRUCT NomeStruttura
Esempio
' Gambas class file
PUBLIC STRUCT Braccio
Lunghezza AS Float
NumeroDita AS Integer
HaUnGuanto AS Boolean
END STRUCT
PUBLIC STRUCT Gamba
Lunghezza AS Float
NumeroDita AS Integer
HaCalzino AS Boolean
HaScarpa AS Boolean
END STRUCT
PUBLIC STRUCT Uomo
Nome AS String
COGNOME AS String
Eta AS Integer
Occhi AS String
BraccioSinistro AS STRUCT Braccio
BraccioDestro AS STRUCT Braccio
LunghezzaGamba AS STRUCT Gamba
GambaDestra AS STRUCT Gamba
END STRUCT
Array di strutture:
Identificatore [ Dimensione ] AS STRUCT NomeStruttura
Le strutture sono incorporate, per esempio il loro contenuto è direttamente assegnato all'interno della matrice.
Array di questo tipo non sono matrici reali, hanno solo alcuni metodi della classe matrice originale:
-
Sono accessibili da indice.
-
Possono essere enumerati.
-
Potete ottenere informazioni circa la lunghezza e la dimensione.
Questo è tutto!
Attenzione! potete creare solo array di strutture incorporate.
Vedi anche