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

10 · Массивы

Динамические массивы

Размер данных не всегда известен в момент объявления: число строк зависит от введённого значения, а набор измерений меняется по ходу работы. Для таких случаев массив объявляют без границ, а хранилище выделяют и перераспределяют во время выполнения.

Четыре действия над массивом

DIM без границ задаёт тип элемента и ранг до получения размера. REDIM выделяет элементы по текущим значениям границ. REDIM PRESERVE сохраняет пересечение старой и новой области. ERASE освобождает хранилище. Эти действия не требуют SCREEN, но и не образуют одну инструкцию: ниже перечислены отдельные формы каждого оператора.

DIM <массив>[] AS <тип элемента>
DIM <массив>[,] AS <тип элемента>
REDIM <массив>[<нижняя граница> TO <верхняя граница>]
REDIM PRESERVE <массив>[<нижняя граница> TO <верхняя граница>]
REDIM PRESERVE <массив>[<границы 1>, <границы 2>]
ERASE <массив>[]

Цель и допустимые границы

Массив обозначает изменяемое массивное значение или динамическое массивное поле TYPE. В REDIM границы стоят в квадратных скобках после имени; ERASE принимает целое имя или поле с суффиксом [], например ERASE bag.values[]. Тип элемента и ранг не изменяются. Для многомерного массива после REDIM указываются границы каждого измерения.

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

Выделение, сохранение и освобождение

Обычный REDIM заменяет элементы значениями по умолчанию. REDIM PRESERVE сохраняет значения по тем же координатам в пересечении границ всех измерений; новые координаты получают значения по умолчанию. Можно менять несколько измерений и нижние границы одновременно, сохраняя ранг.

Один массив может содержать не более 67 108 864 элементов. Если произведение длин измерений превышает этот предел, происходит переполнение формы или среде не хватает памяти, возникает MB3013; процесс не завершается аварийно, а ошибку можно перехватить оператором TRY.

Массив, изначально объявленный с границами DIM, также допускает REDIM. Представление не допускает изменения размера. Фиксированное массивное поле TYPE нельзя передавать операторам REDIM или ERASE.

После ERASE ARRAYISALLOCATED возвращает FALSE, ARRAYLENGTH — 0, ARRAYRANK сохраняет ранг. Для повторного доступа нужны REDIM либо присваивание выделенного массива. Выделенный пустой массив 1 TO 0 имеет состояние TRUE, хотя элементов в нём нет.

Перечисленные действия видны в одной программе:

DIM values[] AS INTEGER
PRINT ARRAYISALLOCATED(values[])
REDIM values[2 TO 3]
values[2] = 10
values[3] = 30
REDIM PRESERVE values[1 TO 4]
PRINT values[2]
PRINT values[4]
ERASE values[]
PRINT ARRAYISALLOCATED(values[])

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

FALSE
10
0
FALSE

Первое FALSE относится к массиву, объявленному без границ. После расширения диапазона с 2 TO 3 до 1 TO 4 элемент с индексом 2 остался в пересечении и сохранил значение 10, а индекс 4 появился впервые и получил значение по умолчанию, то есть 0. Последнее FALSE показывает, что после ERASE массив снова невыделен.

Диагностика

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

MB2011 возникает, если цель REDIM или ERASE не является массивом. MB2025 запрещает эти операторы для фиксированного массивного поля TYPE. MB3007 запрещает изменение размера представления. MB3014 возникает при обращении к представлению, которое устарело после изменения формы корневого массива.

См. также

Массивы · Форма и размер · Диагностика