Работа с одномерными массивами
Массивы используются в ситуациях, когда вам нужно несколько значений для переменной. В ABL есть только одномерные массивы. В отличие от списка, который применяется только к данным CHARACTER, массив может быть определен для любого типа данных ABL. Чтобы определить массив, вы используете оператор VAR или оператор DEFINE VARIABLE . При желании вы можете указать размер (экстенты) массива, то есть количество элементов, которые может содержать переменная. Если вы укажете размер, то переменная будет детерминированным массивом. Если размер не указан при определении, то переменная является неопределённым массивом, и её размер может быть установлен во время выполнения.
Определение переменной массива
Синтаксис для определения переменной массива с помощью оператора VAR:
VAR type-name[size] name [ = [val1,...valn] ].
Синтаксис для определения переменной как массива с помощью оператора DEFINE VARIABLE:
DEFINE VARIABLE name AS type-name EXTENT [size] [NO-UNDO] [INITIAL [val1,...valn]].
name
Имя переменной.
type-name
Тип данных ABL.
size
Значение INTEGER, содержащее максимальное количество элементов, которое может содержать массив. Если размер указан, то массив считается детерминированным массивом и его размер не может измениться во время выполнения. Если размер не указан, то массив считается неопределённым массивом и его размер может измениться во время выполнения.
val1,…valn
Необязательный список начальных значений переменной, разделённых запятыми. Значения заключены в скобки. Вы не обязаны инициализировать все элементы массива.
Следующий оператор определяет массив для хранения ежемесячных квот продаж для торгового представителя. Массив имеет тип INTEGER и содержит 12 элементов:
VAR INTEGER[12] monthlySalesQuotas.
Доступ к элементу массива
В ABL элементы массива индексируются. Первый элемент массива имеет значение индекса 1. В отличие от списков, вы не можете эффективно искать элемент в массиве по значению. Чтобы найти определенное значение, вы должны перебрать все элементы, используя индекс. Чтобы получить доступ к элементу массива, вы заключаете номер индекса в скобки.
VAR INT[12] monthlySalesQuotas = [100500,125000,125000,175000,150000,155000,145000,160000,130000,140000,145000,150000]. MESSAGE "Sales quota for April: $" monthlySalesQuotas[4] VIEW-AS ALERT-BOX.
Пример кода выводит:
Sales quota for April: $ 175000
Для получения дополнительной информации см. Array reference в справочнике по ABL .
Детерминированные и недетерминированные массивы
Является ли массив детерминированным (размер не может измениться) или недетерминированным (размер может меняться), зависит от его определения.
Чтобы определить детерминированную переменную массива, укажите целочисленное значение размера с помощью оператора VAR или DEFINE VARIABLE.
Чтобы определить недетерминированную переменную массива, не указывайте размер в операторе определения переменной. Если в определении указаны начальные значения, то начальным размером массива будет количество предоставленных значений. Если начальные значения не указаны, массив останется недетерминированным, и его размер должен быть установлен во время выполнения, прежде чем вы сможете с ним работать. Размер недетерминированного массива можно установить и сбросить во время выполнения с помощью инструкции EXTENT.
Пример кода показывает определения переменных для детерминированных и недетерминированных массивов:
VAR INT[3] a1. // determinate array
VAR INT[3] a2 = [1,2,3]. // determinate array
VAR INT[] a3. // indeterminate array
VAR INT[] a4 = [4,5,6]. // indeterminate array
Недетерминированный массив может находиться в одном из двух состояний: с размером (фиксированный) или без размера (нефиксированный). Недетерминированный массив не имеет размера при первом определении, если не указаны начальные значения. Вы можете установить размер недетерминированного массива без указания размера:
- предоставив начальные значения. Размером становится количеством предоставленных элементов.
- установив количество элементов в массиве с помощью инструкции EXTENT.
- присвоив массив с размером недетерминированного массива. Размер становится размером исходного массива.
- передачей параметров массива в процедуру, определяемую пользователем функцию или метод класса, так что неопределённое значение массива является целью для передачи исходного массива с размером. Размер массива становится размером исходного массива.
Функция EXTENT
Чтобы определить, сколько элементов в массиве, вы можете использовать функцию EXTENT. Числовое значение возвращается, если есть элементы. Если элементов нет, возвращается неопределённое значение (?).
/* Indeterminate array */ VAR INT[] monthlySalesQuotas = [100500,125000,125000,175000,150000,155000,145000,160000,130000,140000,145000,150000]. /* Determinate array */ VAR INT[12] monthlySales. /* Indeterminate array */ VAR INT[] qtr1Sales. MESSAGE "monthlySalesQuotas array has" EXTENT(monthlySalesQuotas) "elements." SKIP "monthlySales array has" EXTENT(monthlySales) "elements." SKIP "qtr1Sales array has" EXTENT(qtr1Sales) "elements." VIEW-AS ALERT-BOX.
Выполнение кода приводит к выводу:
monthlySalesQuotas array has 12 elements. monthlySales array has 12 elements. qtr1Sales array has ? elements.
Инструкция EXTENT
Инструкция EXTENT устанавливает или сбрасывает размер недетерминированного массива после его определения.
Инструкция EXTENT:
- Задаёт количество элементов для недетерминированной переменной массива или параметра.
- Изменяет размер недетерминированной переменной массива или параметра.
После того, как размер установлен, вы можете использовать недетерминированный массив так же, как и любой детерминированный массив. Вы не можете использовать инструкцию EXTENT для детерминированного массива; если вы это сделаете, то получите ошибку.
В примере кода инструкция EXTENT используется для установки количества элементов недетерминированного массива.
/* Define an indeterminate array */ VAR INT[] qtr1Sales. MESSAGE "qtr1Sales array has" EXTENT(qtr1Sales) "elements." VIEW-AS ALERT-BOX. /* Set the number of elements of the indeterminate array to 4 */ EXTENT (qtr1Sales) = 4. MESSAGE "Set the size: qtr1Sales array has" EXTENT(qtr1Sales) "elements." VIEW-AS ALERT-BOX. /* Resize the indeterminate array to 12 elements */ EXTENT (qtr1Sales) = 12. MESSAGE "Resize the array: qtr1Sales array has" EXTENT(qtr1Sales) "elements." VIEW-AS ALERT-BOX.
Выполнение кода приводит к выводу:
qtr1Sales array has ? elements. Set the size: qtr1Sales array has 4 elements. Resize the array: qtr1Sales array has 12 elements.
Присвоения скалярного значения всем элементам массива
Вы можете присвоить скалярное значение всем элементам детерминированного массива (или недетерминированного массива с размером), используя оператор присваивания.
VAR INT[2] a1. // determinate array VAR INT[] a2. // indeterminate array a1 = 1. // Assign 1 to each element. DISPLAY a1. // Display whole array (size known at compile time) EXTENT(a2) = 2. // Set size to 2 a2 = 2. // Assign 2 to each element DISPLAY a2[1] a2[2]. // Display elements individually // (size not known at compile time)
Пример кода выводит:
a1[1] a1[2] a2[1] a2[2] ---------- ---------- ---------- ---------- 1 1 2 2
Присвоение массива другому массиву
Вы можете назначить один массив другому (Deep copying arrays), если это имеет семантический смысл. При копировании одного массива в другой применяются следующие правила:
- Вы можете присвоить любой массив недетерминированному массиву, размер которого не установлен.
- Вы не можете назначить недетерминированный массив без размера массиву с размером (детерминированному или недетерминированному).
- Если любой из массивов является детерминированным массивом или недетерминированным массивом с размером, то размер должен совпадать. Если размер не совпадает, то AVM выдаст ошибку.
- Вы не можете присвоить скалярное значение недетерминированному массиву без размера.
Пример кода отображает детерминированный массив, назначенный другому детерминированному массиву. Они оба имеют одинаковый размер.
VAR INT[3] sourceArray = [1,2,3]. VAR INT[3] targetArray. targetArray = sourceArray. DISPLAY targetArray.
Результат выполнения кода:
targetArray[1] targetArray[2] targetArray[3] -------------- -------------- -------------- 1 2 3