Константы типа массивов

Язык:
Русский
English

 Константы типа массивов


Объявление константы типа массива определяет значения компонентов массива.

Тип компонентов массива может быть любым, кроме файлового.

Пример

 type
   Status    = (Active, Passive, Waiting);
   StatusMap = array[Status] of String[7];

 const StatStr : StatusMap = ('Active', 'Passive', 'Waiting');

  { компоненты StatStr:
    StatStr[Active] = 'Active'
    StatStr[Passive] = 'Passive'
    StatStr[Waiting] = 'Waiting' }

Символьные массивы

Упакованные константы со строковым типом (символьные массивы) могут быть определены и как одиночные символы, и как строки. Например, такое определение:

   const Digits : array[0 .. 9] of Char = ('0', '1', '2', '3', '4', '5',
                                                      '6', '7', '8', '9');

может быть выражено более коротко:

   const Digits : array[0 .. 9] of Char = '0123456789';

Нуль-основанные символьные массивы

Нуль-основанный символьный массив - это такой массив, в котором индекс первого элемента равен нулю, а последнего - положительному ненулевому целому числу. Например:

   array[0 .. X] of Char;

Если вы включаете расширенный синтаксис (с помощью директивы компилятора {$X+}), то нуль-основанный символьный массив может быть инициализирован строкой, длина которой меньше, чем объявленная длина массива. Например:

   const FileName = array[0 .. 79] of Char = 'TEST.PAS';

Если строка короче, чем длина массива, то оставшиеся символы устанавливаются равными NULL (0), и массив будет содержать строку с нулевым окончанием.

Константы - многомерные массивы

Такие константы определяются заключением констант каждой размерности в отдельные наборы круглых скобок, разделенные запятыми.

Например, такое объявление:

   type
     Cube = array[0 .. 1, 0 .. 1, 0 .. 1] of Integer;

   const Maze : Cube = (((0, 1), (2, 3)), ((4, 5), (6, 7)));

создаёт инициализированный массив Maze:

   Maze[0, 0, 0] = 0
   Maze[0, 0, 1] = 1
   Maze[0, 1, 0] = 2
   Maze[0, 1, 1] = 3
   Maze[1, 0, 0] = 4
   Maze[1, 0, 1] = 5
   Maze[1, 1, 0] = 6
   Maze[1, 1, 1] = 7

Ада

Агрегаты (так они называются в языке Ада) можно использовать не только при инициализации констант, но и вообще в любых выражениях. В ЛЮБЫХ!

 procedure Arr_Agg is
   
    type Cube is array (0 .. 1, 0 .. 1, 0 .. 1) of Integer;
   
    Maze : Cube := (((0, 1), (2, 3)), ((4, 5), (6, 7)));
   
 begin
    Maze := (((7, 6), (5, 4)), ((3, 2), (1, 0)));
 end Arr_Agg;

Подобные скобочные выражения могут быть восприняты компилятором двояко, и в этом случае нужно явно указывать тип с помощью конструкции тип'(значение). Например:

 Cube'(((7, 6), (5, 4)), ((3, 2), (1, 0)))

будет всегда воспринято однозначно. В приведённом выше примере тип указывать не потребовалось, потому что сопоставление типов в языке Ада производится не только снизу вверх, но и сверху вниз. Переменной Maze можно присвоить только выражение типа Cube, поэтому указание типа было необязательно.

Одним из следствием двустороннего сопоставления типов является возможность перегружать функции не только по типу аргументов, но и по типу результата.

Также внутри агрегатов можно указывать индексы:

 -- Демонстрация гибкости массивных агрегатов
 Cube'(0 => (1 => (0 | 1 => 7), 0 => (1 => 5, others => 4)),
       1 => ((0 .. 1 => 3), others => (others => <>)))

Индексированные элементы должны следовать за неиндексированными. На порядок элементов нет ограничений. Индексированный элемент может задавать значение сразу нескольким элементам массива. Для этого отдельные индексы и диапазоны индексов перечисляются через | (знак трубы). Также можно в конце списка использовать зарезервированное слово others, чтобы задать значение оставшимся элементам:

 (1 | 3 .. 5 | 7 | 9 .. 11 | 13 .. 15 => True, others => False)

Лексема <> означает значение по умолчанию.

Как и в Borland Pascal, строковый литерал эквивалентен агрегату символов.

См. также

Лекция №3.2: Ветвления. Массивы. Циклы

Код для вставки: :: :: :: ::
Поделиться: // //