- 133 -
Array [9..99] of Char; { массив из 91 элемента }
Array [-10.. 10] of LongInt; { массив из 21 элемента }
Это очень удобно, так как позволяет не заботиться о приведении индексов к диапазону 1..N, как, например, приходится поступать при работе с Фортраном или некоторыми версиями Бейсика.
В общем случае ничто не обязывает объявлять диапазон индексов массива числами. В качестве индексов можно использовать любые перечислимые типы, как встроенные, так и вводимые. Индексы могут задаваться по-прежнему диапазоном, а если диапазон соответствует всему типу, то можно вместо него просто записать имя этого перечислимого типа:
TYPE
Monthtype = ( January, February, March, April, May );
ComplectType = Array [ MonthType ] of Word;
SpringType = Array [ March..May ] of Word;
VAR
Complect : ComplectType; { пять элементов типа Word }
Spring : SpringType; { три элемента типа Word }
Alpha : Array [ 'A'..'z'] of Char;
Switch : Array [Boolean] of Byte; { два элемента }
Элементы массивов будут индексироваться значениями заданных перечислимых типов или их диапазонов: Complect [January] — первый, a Spring[May] — последний элементы в своих массивах; аналогичен смысл обращений Alpha [ 'А' ] и Switch [True].
Рассмотренные массивы — одномерные, т.е. такие, у которых компоненты — скаляры. Разрешено объявлять массивы массивов:
TYPE
VectorType = Array [ 1..3 ] of Real; { вектор }
MatrixType = Array [ 1..10] of VectorType; { матрица10x3 }
Описание типа двумерного массива MatrixType могло быть записано по-другому:
TYPE
MatrixType = Array [ 1..10] of Array [ 1..3 ] of Real;
или как
MatrixType = Array [ 1..10, 1..3 ] of Real;
Последний вариант наиболее наглядно представляет описание матрицы. Количество измерений формально не ограничено, но сумма размеров всех компонентов массива не должна превосходить 64K.
- 134 -
Каждое измерение совершенно не зависит от остальных, и можно объявлять массивы с разными индексами:
VAR
M : Array [ -10..0, 'A'..'C', Boolean ] of Byte;
Эквивалентная запись:
M : Array [-10..0] of
Array [ 'A'..'C' ] of
Array [Boolean] of Byte;
Интересно, что тип элемента массива M зависит от числа указанных при нем индексов. Так,
M[0] — массив-матрица типа Array['A'..'C',Boolean] of Byte,
М[0, 'B'] — вектор типа Array[Boolean] of Byte,
M[0, 'B', False] — значение типа Byte.
Если будут использоваться различные уровни «детализации» многомерных массивов, то надо будет позаботиться о совместимости по типу. Так, при приведенном выше описании массива M нельзя реально поставить подмассив M[0] в оператор присваивания, так как это не по правилам совместимости. Надо переписать объявление типа примерно так: