Declaração de estrururas
PUBLIC STRUCT Identifier
Field 1 [ Embedded array declaration ] AS [ Datatype ]
Field 2 [ Embedded array declaration ] AS [ Datatype ]
.
.
.
Field n [ Embedded array declaration ] AS [ Datatype ]
END STRUCT
Esta palavra-chave declara uma estrutura.
A estrutura é exatamente igual a uma classe que teria apenas variáveis públicas.
Se você declarar a mesma estrutura em duas classes diferentes, elas devem ter exatamente os mesmos campos,
do contrário, o interpretador vai gerar um erro.
Alinhamento de Campos
Estruturas nunca são acondicionadas, ou seja, os campos estão alinhados a um endereço de memória que é um múltiplo da sua extensão de memória:
-
Um Boolean ou um Byte pode ser armazenado em qualquer endereço.
-
Um Short é armazenado em um mesmo endereço.
-
Um Integer é armazenado num endereço que é um múltiplo de quatro.
-
... E assim por diante.
Como a ordem de declaração é respeitada, você pode ter buracos na sua estrutura.
Por exemplo, se você declarar um arquivo Byte, e depois um campo
Integer, você vai ter um buraco de três bytes.
Há um problema, então: quando compilar o código fonte C, o compilador C pode reordenar campos de estrutura.
E, tanto quanto eu sei, esse processo não é padronizado nem documentado.
Pode haver uma solução no futuro com a biblioteca libffi utilizada por Gambas.
Aparentemente, essa biblioteca pode enviar uma estrutura para uma função C
levando esse problema em concideração. mas essa
biblioteca é muito menos documentada que Gambas, então, você pode imaginar a dificuldade!
Estruturas incorporadas
A estrutura pode ser incorporado dentro de uma classe normal ou outra estrutura, ao declarar uma variável com a seguinte sintaxe:
[ PRIVATE | PUBLIC ] Identifier AS STRUCT Structure name
Exemplos
' Gambas class file
PUBLIC STRUCT Arm
Length AS Float
NumberOfFingers AS Integer
HasGlove AS Boolean
END STRUCT
PUBLIC STRUCT Leg
Length AS Float
NumberOfFingers AS Integer
HasSock AS Boolean
HasShoe AS Boolean
END STRUCT
PUBLIC STRUCT Man
FirstName AS String
LastName AS String
Age AS Integer
Eyes AS String
LeftArm AS STRUCT Arm
RightArm AS STRUCT Arm
LeftLeg AS STRUCT Leg
RightLeg AS STRUCT Leg
END STRUCT
Arrays da estrutura
Identifier [ Dimensions ] AS STRUCT Structure name
As estruturas são incorporados, ou seja, seu conteúdo está diretamente alocados dentro do array.
Esses arrays não são matrizes reais, eles têm apenas alguns métodos da classe array original:
-
Eles podem ser acessados pelo índice.
-
Eles podem ser enumerados.
-
Você pode obter informações sobre o comprimento do array e as dimensões do array.
Isso é tudo!
Em estruturas você pode criar somente array embedded.
Veja também