10 · Массивы
Оператор REDIM
Когда размер массива становится известен только при выполнении, границы задают оператором REDIM. Он выделяет хранилище по новым границам и либо создаёт элементы заново, либо сохраняет те из них, чьи индексы остались в новой области.
Синтаксис
Оператор записывается в двух формах, которые различаются наличием слова PRESERVE.
REDIM <массив>[<нижняя граница> TO <верхняя граница>]REDIM PRESERVE <массив>[<нижняя граница> TO <верхняя граница>]REDIM <массив>[<нижняя 1> TO <верхняя 1>, <нижняя 2> TO <верхняя 2>]REDIM PRESERVE <массив>[<нижняя 1> TO <верхняя 1>, <нижняя 2> TO <верхняя 2>]Для каждого измерения указывается отдельная пара границ. Пары следуют в порядке измерений и разделяются запятыми.
Цель и параметры
Целью служит объявленный изменяемый массив или его доступное массивное поле. Новые границы записываются в квадратных скобках после имени: REDIM values[1 TO 3] или REDIM bag.values[1 TO 3]. Пустой суффикс [] перед списком границ не добавляется. Объявление заранее задаёт тип элементов и ранг; перераспределение меняет только границы и содержимое.
<массив>— изменяемое значение массива.- Нижняя и верхняя границы — целочисленные выражения с допустимыми индексами. Обе границы входят в диапазон.
PRESERVE— необязательное ключевое слово сохранения элементов.
Правила работы
Обычная форма заменяет хранилище и заново задаёт начальные значения элементов. Форма PRESERVE переносит элементы с совпадающими индексами во всех измерениях. Новые позиции получают значения по умолчанию; при пустом пересечении ни один прежний элемент не переносится.
Тип элементов и число измерений остаются прежними. Фиксированное массивное поле TYPE не допускает перераспределения. Граничные случаи и пустые измерения рассматриваются отдельно. Связанные материалы: многомерных массивов.
Разница между формами видна на одном массиве: сначала он получает два элемента, затем расширяется до трёх с сохранением.
DIM values[] AS INTEGER
REDIM values[1 TO 2]
values[1] = 10
REDIM PRESERVE values[1 TO 3]
PRINT values[1]
PRINT values[3]Программа выводит:
10
0Индекс 1 входил и в старую, и в новую область, поэтому значение 10 сохранилось. Индекс 3 появился только при втором выделении, и элемент получил значение по умолчанию — 0. Обычный REDIM без PRESERVE на этом месте обнулил бы и первый элемент.
Связанные программы проверяют сохранение значений и пустую форму. Связанные материалы: сохранение элементов, пустой массив.
Диагностика
MB2011— цель не является массивом.MB2010— цель объявлена неизменяемой.MB2004— число измерений не соответствует рангу массива.MB2025— цель является фиксированным полем массива в записиTYPE.
Отказ неверных границ относится к времени выполнения; его условия приведены в диагностике массивов. Связанные материалы: диагностике массивов.