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

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.

Отказ неверных границ относится к времени выполнения; его условия приведены в диагностике массивов. Связанные материалы: диагностике массивов.

См. также