10 · Массивы
Одномерные массивы
Последовательность оценок, измерений или имён удобнее хранить под одним именем, чем заводить переменную для каждого значения. Такую последовательность задаёт одномерный массив: у него один диапазон индексов, а элемент выбирается единственным числовым индексом.
Объявление и его части
Массив вводится оператором DIM. Форма с двумя границами сразу создаёт элементы, форма с пустыми скобками объявляет тип элемента и ранг, не выделяя хранилище, а третья запись присваивает значение уже существующему элементу.
DIM <имя массива>[<нижняя граница> TO <верхняя граница>] AS <тип элемента>DIM <имя массива>[] AS <тип элемента><имя массива>[<индекс>] = <значение>Имя массива обозначает массивную переменную, а тип после AS определяет допустимые значения всех элементов. Индекс является числовым выражением, выбирающим один элемент. Значение присваивания должно быть совместимо с типом элемента.
Если все значения известны заранее, их можно перечислить в литерале массива и не заполнять элементы по одному: DIM fruits[] AS STRING = ["яблоко", "банан"]. Такой массив начинается с индекса 1. Правила литерала описаны в статье Литерал массива.
Границы задаются числовыми выражениями. Допустимы INTEGER, LONG, DOUBLE и DECIMAL, но значение должно быть целым и помещаться в INTEGER. Ненулевая дробная часть вызывает MB3007; усечения нет. Нижняя граница -2147483648 запрещена, потому что поисковые функции используют нижнюю границу минус 1 как признак отсутствия. Верхняя граница включается в массив. Обратный диапазон допустим только как каноническая пустая форма 1 TO 0 при DIM или REDIM.
Диапазон, выделение и обход
Диапазон может начинаться с отрицательного значения или нуля; начальный индекс 1 используется только там, где он указан в объявлении или выбран функцией, создающей результат. Поэтому при обходе элементов нельзя заранее предполагать, что первый из них имеет номер 0 или 1.
DIM с границами создаёт элементы со значениями по умолчанию. DIM с пустыми измерениями сохраняет тип и ранг без выделения элементов. Полное индексирование возвращает один элемент; частичное индексирование создаёт представление оставшихся измерений. Работа с массивом разрешена на верхнем уровне, в процедуре и в функции; SCREEN не требуется.
Обход, который опирается на фактические границы, выглядит так:
DIM scores[1 TO 3] AS INTEGER
scores[1] = 10
scores[2] = 20
scores[3] = 30
FOR i = LBOUND(scores[]) TO UBOUND(scores[])
PRINT scores[i]
NEXTПрограмма выводит:
10
20
30В заголовке цикла стоят LBOUND и UBOUND, а не числа 1 и 3, поэтому тот же текст продолжит обходить все элементы, если границы массива изменятся.
Схема индексов
Подписанные координаты выбирают элемент внутри включительных границ. Пустая клетка хранит значение по умолчанию до первого присваивания.
индекс: 1 2 3
[10][20][30]Диагностика
Несовместимый тип элемента или индекса даёт MB2003, неверное число индексов — MB2004. Если индекс или диапазон при индексировании выходит за границы, возникает MB3002; доступ к невыделенному массиву и недопустимая пара границ сообщаются кодом MB3005. Запрещённая нижняя граница -2147483648 вызывает MB3007, а выход числового значения за диапазон INTEGER — MB3008.