# Flexible names

Flexible names were introduced in section 5.5, but only one-dimensional names. What has not been made apparent in the text hitherto is that a multiple consists of two parts: a descriptor and the actual elements. The descriptor contains the lower and upper bounds of each dimension, the “stride” (that is, the number of bytes between two successive elements of the dimension in question), the address in memory of the first element of that dimension and whether the dimension is flexible. Consider the declaration

       FLEX[1:0][1:3]INT flexfix

Because the mode of `flexfix` is `REF FLEX[][]INT`, when it is subscripted, the mode of each element is `REF[]INT` with bounds of `[1:3]`. Clearly, after the declaration, `flexfix` has no elements. In practice, because the first (and only) dimension is flexible, there must be some way of referring to a “ghost” element whose descriptor (it is a one-dimensional multiple) will give its properties. `flexfix` is quite different from

       FLEX[1:0]FLEX[1:3]INT flexflex

each of whose elements (when it has any) have the mode `REF` `FLEX[]INT` with initial bounds `[1:3]`.

If the declaration of `flexfix` is followed by the assignment and slice

       flexfix:=LOC[1:1][1:3]INT;
       flexfix[1]:=(1,2,3)

then it is clear that the mode of `flexfix[1]` is `REF[]INT`. Note that after

       flexfix:=LOC[1:4][1:3]INT

`flexfix` refers to a multiple of which each element has the mode `[]INT`. However, the single dimension of

       flexfix[1]

is not flexible, which is why the assignment

       flexfix:=LOC[1:4][1:4]REAL #this is wrong#

will fail11.5.