结构体声明

PUBLIC STRUCT Identifier Field 1 AS Datatype Field 2 AS Datatype . . . Field n AS Datatype END STRUCT

该关键字声明一个结构体。

在内部,结构与只有公共变量的类完全相同;但是您可以将它们声明为嵌入式结构或嵌入式结构数组,如下所述。

当使用嵌入式结构或结构的嵌入式数组时,解释器必须创建

临时对象,以便可以像真实对象一样操作它们。而且速度较慢!

因此, 除非迫不得已,否则不要使用结构! 例如,到

与需要C结构的共享C库函数通信。

尽管必须声明结构 PUBLIC, 作为二等公民,他们不能在class代码之外使用。

如果在两个不同的类中声明同样的结构体,那么它们必须有完全一样的域,否则解释器会发生一个错误。

Embedded Arrays

You can have embedded arrays in structures using

PUBLIC STRUCT Identifier ... Field k [ Embedded array declaration ] AS Datatype ... END STRUCT

Fields Alignment

Structures are never packed, i.e. fields are aligned to a memory address that is a multiple of its memory length:
  • A Boolean or a Byte can be stored at any address.

  • A Short is stored at an even address.

  • An Integer is stored at an address that is a multiple of four.

  • ...and so on.

As the declaration order is respected, you may have holes in your structure. For example, if you declare a Byte field and just after an Integer field, you will have a three bytes hole.

There is a problem then: when compiling the C source code, the C compiler may reorder structure fields. And, as far as I know, that process is not standardized nor documented.

There may be a solution in the future with the libffi library used by Gambas. Apparently, that library can send a structure to a C function by taking that problem into account. But that library is far less documented than Gambas, so you see the difficulty!

结构体嵌套

通过下面的语法声明一个变量,可以将一个结构体嵌套到一个正常的类或另一个结构体的内部:

[ PRIVATE | PUBLIC ] Identifier AS STRUCT Structure name

示例

' 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 Of Structure

Identifier [ Dimensions ] AS STRUCT Structure name

The structures are embedded, i.e. their contents is directly allocated inside the array.

Such arrays are not real arrays, they have only a few methods of the original array class:
  • They can be accessed by index.

  • They can be enumerated.

  • You can get information about the array length and array dimensions.

That's all!

You can create only embedded array of structures.

See also