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