A type that provides access to an
object of a given type. Access to such an object is achieved by an
access value returned by an allocator; the access value is said to
designate the object.
Access type allows to manipulate data, which are created dynamically
during simulation and which exact size is not known in advance. Any
reference to them is performed via allocators,
which work in a similar way as pointers in programming languages.
The subtype_indication in
the access type declaration
denotes the type of an object designated by a value of an access
type. It can be any scalar, composite or other access type (example
1). File type is not allowed here.
The only objects allowed to be of the access type are variables.
The default value of an access type is null
which designates no object at all. To assign any other value
to an object of an access type an allocator
has to be used (see allocator
The access type allows to
create recursive data structures (dynamic lists of objects created
during simulation) which consist of the records that contain elements
of access types - either the same or different than the actually
declared. In order to handle declarations of such recursive data
structures so called incomplete
type declaration is needed which plays a role of an
"announcement" of a type which will be declared later on.
For each incomplete type declaration there must be a corresponding
full type declaration with the same name. The complete declaration
must appear in the same declarative part. A type declared as
incomplete may not be used for any other purposes than to define an
access type before the complete type definition is accomplished. Such
an incomplete type declaration is presented in example 2 below.
-- declaration of record type Person:
type Person is record
end record Person;
-- declaration of access type Person_Access:
type Person_Access is access Person;
The Person_Access type defines a pointer (dynamic link) to a record
declared earlier and called Person.
-- declaration of an incomplete type Queue_Element:
-- declaration of an access type Queue_Element_Ptr:
type Queue_Element_Ptr is access Queue_Element;
-- declaration of an full record type Queue_Element:
type Queue_Element is record
end record Queue_Element;
The type Queue_Element contains the Queue_Element_Ptr field, which in
turns points to Queue_Element. In order to declare both types
sequentially, first the Queue_Element is declared in an incomplete
way, which allows declaring the access type Queue_Element_Ptr.
Finally, complete declaration of Queue_Element must be provided.
Application of access types is restricted to variables: only
variables can be of an access value. Also, only variables can be
designated by an access value.
Although access types are very useful for modeling potentially large
structures, like memories or FIFOs, they are not supported by