Coral 66 Language Reference Manual: For mission-critical applications | ||
---|---|---|
Prev | Chapter 4. Reference to Data | Next |
There are two systems for referring to packed data, one in which as
unnamed field is selected from any computer word which holds data (see
), and one in which the data format is
declared in advance. In the latter system, with which this section is
concerned, the format is replicated to form a table. A
group of n
words is arbitrarily partitioned into
bit-fields (with no fields crossing a word boundary), and the same
partitioning is applied to as many such groups (m
say) as
are required. The total data-space for a table is thus nm
words. Each group is known as a table-entry. The
fields are named, so that a combination of field identifier and entry index
selects data from all or part of one computer word, known as a
table-element. The elements in a table may occupy
overlapping fields, and need not together fill all the available space in
the entry.
A table declaration serves two purposes. The first is to provide the table with an identifier, and to associate this identifier with an allocation of word-storage sufficient for the width and number of entries specified. For example
is the beginning of a declaration for the table "april" with 30 entries each 3 words wide, requiring an allocation of 90 words in all. The second purpose of the declaration is to specify the structure of an entry by declaring the elements contained within it, as defined in below. Data-packing is implementation dependent, and the examples will be found to assume a word length of 24 bits. The syntax for a table declaration is
Tabledec
::=
TABLE
Id
[ Width
, Length
]
[Elementdeclist
Elementpresetlist
] Presetlist
Elementdeclist
::=
Elementdec
Elementdec
; Elementdeclist
Width
::= Integer
Length
::= Integer
Details of the two presetting mechanisms are given in .
A table element declaration associates an element name with a numeric type and with a particular field of each and every entry in the table. The field may be whole or part of a computer word, and the form of a declaration differs accordingly. The syntax for an element declaration, more fully developed in , is
Elementdec
::=
Id
Numbertype
Wordposition
Id
Partwordtype
Wordposition
, Bitposition
Wordposition
::= Signedinteger
Bitposition
::= Integer
Word-position and bit-position are numbered from zero upward, and the
least significant digits of a word occupies bit-position zero. Normally,
table-elements will be located so that they fall within the declared width
of the table, but a Coral 66 compiler does not check the limits. To improve
program legibility, it is suggested that the word BIT be
permitted as an alternative to the comma in the above text. The meaning of
Bitposition
is given in see .
As shown in the syntax of the previous section, the form of declaration for whole-word table-elements is
Id
Numbertype
Wordposition
For example,
declares a pseudo-array of elements named "tickets". (True array elements are located consecutively in store, see .) Each element refers to a (signed) integer occupying a word-position zero in an entry. Similarly,
locates "weight" in word-position 1 with a significance of 16 bits, stopping 4 bits short of the binary point. Floating-point elements are similarly permitted.
Elements which occupy fields narrower than a computer word (and only such elements) are declared in forms such as
for fixed-point elements
. The fixed-point scaling is given in brackets
(total bits and fraction bits), followed by the word- and bit-position of the
field within the entry. Word-position is the word-position within which the
field is located, and bit-position is the bit at the least significant end of
the field. The word UNSIGNED increases the capacity of the field for
positive numbers at the expense of eliminating negative numbers. For example,
(4,2) allows numbers from -2.0 to 1.75 whilst UNSIGNED(4,2) allows them
from 0.0 to 3.75. If the scale contains only a single integer, e.g.
the number in brackets represents the total number of bits for a
part-word integer
. Though (4,0) and (4) have essentially the
same significance, the fact that (4,0) indicates fixed-point type and (4)
indicates an integer, should be borne in mind when such references are used in
expressions. The syntax of Partwordtype
, for substitution in
the syntax of , is
Partwordtype
::=
Elementscale
UNSIGNED
Elementscale
Elementscale
::=
( Totalbits
, Fractionbits
)
( Totalbits
)
The rules for Totalbits
and
Fractionbits
are in .The number
of fraction bits may be negative, zero, or positive, and it is for
the binary point to lie outside the declared field.
TABLE april [3, 30] [ tickets INTEGER 0; weight FIXED(16, -4) 1; rain UNSIGNED(4, 2) 2, 0; sunshine UNSIGNED (4) 2, 4; humidity UNSIGNED(6, 6) 2, 8; temperature (10, 2) 2, 14]
It should be noted that all the numbers used to describe and locate fields must be constants.
A table element is selected by indexing its field identifier. To continue
from the example in , the rain for
april 6th would be written rain[5], for it should be noted than an entry always
has the conventional lower bound of zero. In use, the names of table-elements
are always indexed. On the other hand, a table identifier such as "april" may
stand on its own when a table reference is passed to a procedure. The use of an
index with a table-identifier does not (other than
accidentally) select an entry of the table. It selects a computer word from the
table data regarded as a conventional array of single computer words, with
lower index bound zero. Thus the implied bounds of the array "april" are 0 :
89. A word so selected is treated as a signed integer
, from
which it follows that april[6] in the example would be equivalent to
tickets[2]. A table name is normally indexed only for the purpose of running
through the table systematically, for example to set all data to zero, or to
form a base for overlaying (see ).