Keywords: pame

Subsections

- Exercises

# Multiples in structures

If multiples are required in a structure, the structure declaration should only contain the required bounds if it is an actual-declarer. For example, we could declare

       STRUCT([]CHAR forename,
                     surname,
                     title)
          lecturer=
             ("Nerissa","Leitch","Dr")

where the mode on the left is a formal-declarer (remember that the mode on the left-hand side of an identity declaration is always a formal-declarer). We could equally well declare

       STRUCT([]CHAR forename,
                     surname,
                     title)
          student=
                ("Tom","MacAllister","Mr")

As you can see, the bounds of the individual multiples differ in the two cases.

When declaring a name, because the mode preceding the name identifier is an actual-declarer (in an abbreviated declaration), the bounds of the required multiples must be included. A suitable declaration for a name which could refer to `lecturer` would be

       STRUCT([7]CHAR forename,
              [6]CHAR surname,
              [3]CHAR title)
                new lecturer := lecturer

but this would not be able to refer to `student`. A better declaration would use `STRING`:

       STRUCT(STRING forename,surname,title)person

in which case we could now write

       person:=lecturer;
       person:=student

Using field selection, we can write

       title OF person

which would have mode `REF STRING`. Thus, using field selection, we can assign to the individual fields of `person`:

       surname OF person:="McRae"

When slicing a field which is a multiple, it is necessary to remember that slicing binds more tightly than selecting (see chapter 10 for a detailed explanation). Thus the first character of the surname of `student` would be accessed by writing

       (surname OF student)[1]

which would have mode `CHAR`. The parentheses ensure that the selection is elaborated before the slicing. Similarly, the first five characters of the forename of `person` would be accessed as

       (forename OF person)[:5]

with mode `REF[]CHAR`.

Consider the following program:

       PROGRAM t1 CONTEXT VOID
       BEGIN
          MODE AMODE = STRUCT([4]CHAR a,INT b);
          AMODE a = ("abcde",3);
          AMODE b:=a;
          SKIP
       END
       FINISH

In the identity declaration for `a`, the mode required is a formal-declarer. In this case, the a68toc compiler will ignore the bounds in the declaration of `AMODE` giving the mode

       STRUCT([]CHAR a,INT b)

which explains why the structure-display on the right is accepted (`"abcde"` has bounds `[1:5]`). However, although the program compiles without errors, when it is run, it fails with the error message

       Run time fault (aborting):
       ASSIGN2: bounds do not match in [] assignment

because the mode used in the declaration of the name `b` is an actual-declarer (it contains the bounds given in the mode declaration) and you cannot assign a `[]CHAR` with bounds `[1:5]` to a `REF[]CHAR` with bounds `[1:4]`.

With more complicated structures, it is better to use a mode declaration. For example, we could declare

       MODE EMPLOYEE =
          STRUCT(STRING name,
                 [2]STRING address,
                 STRING dept,ni code,tax code,
                 REAL basic,overtime rate,
                 [52]REAL net pay,tax);

       EMPLOYEE emp

and then read specific values from the keyboard (chapter 9 covers reading data from files):

       read((name OF emp,newline,
             (address OF emp)[1],newline,
             (address OF emp)[2],newline,
       ...

The modes of

       name OF emp
       address OF emp
       net pay OF emp

are

       REF STRING
       REF[]STRING
       REF[]REAL

respectively. The phrase

       (net pay OF emp)[:10]

has the mode `REF[]REAL` with bounds `[1:10]` and represents the net pay of `emp` for the first 10 weeks. Note that although the monetary values are held as `REAL` values, the accuracy with which a `REAL` number is stored is such that no rounding errors will ensue. See section 12.1.5 which describes which modes are suitable for storing monetary values.

## Exercises

7.11
  Given the declaration of `emp` in the text, what would be the mode of each of the following: Ans
  (a)
    `address OF emp`

  (b)
    `basic OF emp`

  (c)
    `(tax OF emp)[12]`

  (d)
    `(net pay OF emp)[10:12]`

7.12
  What are the bounds of the name in (d) above? Ans