Axiom Справочник языка

10 · Массивы

Многомерные массивы

Когда данных больше двух независимых координат, одного индекса и пары индексов уже не хватает: элемент выбирается набором координат, по одной на каждое измерение, в порядке измерений объявления. Массивы ранга выше второго описываются на этой странице.

Объявление и его части

Ниже показаны формы для трёхмерного массива: объявление с выделением элементов, объявление динамического массива без элементов и присваивание одному элементу. Для каждого выделяемого измерения обе границы и ключевое слово TO обязательны. Для другого ранга число диапазонов или индексов изменяется соответственно.

DIM <имя массива>[<нижняя граница 1> TO <верхняя граница 1>, <нижняя граница 2> TO <верхняя граница 2>, <нижняя граница 3> TO <верхняя граница 3>] AS <тип элемента>
DIM <имя массива>[,,] AS <тип элемента>
<имя массива>[<индекс 1>, <индекс 2>, <индекс 3>] = <значение>

Каждые границы измерения записываются как числовое выражение нижней границы TO числовое выражение верхней границы. Индексы выбирают координаты в соответствующих измерениях, а тип элемента общий для всех координат. Для ранга выше 3 список продолжается; число пустых мест в динамическом объявлении задаёт ранг.

Границы задаются числовыми выражениями. Допустимы INTEGER, LONG, DOUBLE и DECIMAL, но значение должно быть целым и помещаться в INTEGER. Ненулевая дробная часть вызывает MB3007; усечения нет. Нижняя граница -2147483648 запрещена, потому что поисковые функции используют нижнюю границу минус 1 как признак отсутствия. Верхняя граница включается в массив. Обратный диапазон допустим только как каноническая пустая форма 1 TO 0 при DIM или REDIM.

Форма и обход измерений

Массив сохраняет прямоугольную форму во всех измерениях. ARRAYBOUNDS возвращает таблицу (1 TO ранг, 1 TO 2): нижние границы стоят в первом столбце, верхние — во втором. При последовательном обходе встроенных функций последнее измерение меняется быстрее первого.

DIM с границами создаёт элементы со значениями по умолчанию. DIM с пустыми измерениями сохраняет тип и ранг без выделения элементов. Полное индексирование возвращает один элемент; частичное индексирование создаёт представление оставшихся измерений. Работа с массивом разрешена на верхнем уровне, в процедуре и в функции; SCREEN не требуется.

Границы каждого измерения задаются отдельно и могут быть отрицательными:

DIM cube[1 TO 2, -1 TO 1, 4 TO 5] AS INTEGER
cube[2, 0, 5] = 8
PRINT ARRAYRANK(cube[])
PRINT cube[2, 0, 5]
PRINT LBOUND(cube[], 2)
PRINT ARRAYLENGTH(cube[])

Программа выводит:

3
8
-1
12

Ранг равен трём, потому что объявление задаёт три диапазона. LBOUND с номером 2 возвращает нижнюю границу второго измерения, а не первого, поэтому результат отрицательный. Двенадцать элементов складываются из длин измерений 2, 3 и 2.

Диагностика

Несовместимый тип элемента или индекса даёт MB2003, неверное число индексов — MB2004. Индекс или диапазон, вышедший за границы при индексировании, сообщается кодом MB3002; невыделенный массив и недопустимая пара границ — кодом MB3005. Запрещённая нижняя граница -2147483648 вызывает MB3007, выход числового значения за диапазон INTEGER — MB3008.

См. также

Массивы · Индексирование · Изменение размера