79
[Public | Private] Structure <name>
<member-definition>
...
End Structure
If neither Private nor Public is specified, the structure definition is public. The ellipsis (
) in the
syntax above connotes that there may be zero or more additional member definitions. A structure
definition must have least one member and may have a practically unlimited number of members.
A structure may be defined within a subroutine or function, either at the outer level or within any inner
block. In this case, the Public and Private keywords have no useful purpose and are therefore not
allowed.
After a structure has been defined, the structure name may be used as a <type> in a variable or
structure definition. A structure may also be used as the <type> in the formal parameter list of a
subroutine or function definition. Note, however, that a Public subroutine or function cannot be defined
with a parameter that is a Private Structure.
A <member-definition> has the same syntax as that used to define a variable. As with an ordinary
variable, a member may be a single data element or it may be an array. The syntax for a member
definition is given by the two descriptions below the first being for a non-array member and the second
being for a member that is an array.
{Public | Private | Dim} <name> As <type>
or
{Public | Private | Dim} <name>(<dim-spec-list>) As <type>
As with ordinary variables, Dim has exactly the same effect as Private, i.e., the member will only be
directly accessible to code within the module. In contrast, a Public member may be accessed by code
outside of the module in which the structure is defined. The names of the members of each structure
defined may be any legal identifier however a particular name may be used only once in each structure.
The use of a name as a member in one structure does not preclude it from also being used as a member
name in a different structure or as a variable, constant, parameter, etc. This circumstance is a result of
the ZBasic scoping rules - a structure definition is an independent name scope.
The <type> specified for a member may be any of the pre-defined types like Integer, Byte, String,
etc. or it may be a user-defined type like an enumeration or another structure. The amount of space
required for each member in a structure is the same as for a variable of the same type (but see the
discussion below relating to sub-byte types and alignment). It is important to note that recursive structure
definitions, with members that are or contain (directly or indirectly) the structure being defined, are not
allowed.
Examples
Structure MyDate
Public year as UnsignedInteger
Public month as Byte
Public day as Byte
End Structure
Structure MyTime
Public hour as Byte
Public minute as Byte
Public seconds as Single
End Structure
Structure MyTimeStamp
Public tdate as MyDate
Public ttime as MyTime