结构体声明
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