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


При описании массива не всегда можно заранее, на стадии написании программы, знать, сколько элементов будет в массиве. Например, это выбирает пользователь. Или количество элементов определяется файлом-источником и т.п. С другой стороны некоторые вычислительные методы могут в процессе расчетов уменьшать количество «рабочих» элементов, при этом хотелось бы освобождать не нужную память.

Для реализации всего вышеизложенного нам поможет инструкция ReDim. Сначала может быть описан динамический массив, например, так:

Dim имямассива () [As type]

Обратите внимание на то, что указывается имя массива и не обязательно указывается тип элементов, но не указывается количество элементов. В дальнейшем можно уточнить описание этого массива, задав количество элементов. Синтаксис инструкции:

ReDim имямассива (границы) [As type]

Ключевое место в этой инструкции – описание границ изменения индексов. Это описание выглядит следующим образом:

[нижняяграница to] верхняяграница, [нижняяграница to] верхняяграница, …

Для каждого индекса можно задать начальное и конечное значение. Если не задавать начальное, то оно определяется по умолчанию (указано в настройках) либо задается при помощи инструкции Option Base.

Option base 1 'установка нижней границы индексов по умолчанию = 1.

Dim Lower

Dim MyArray(20), TwoDArray(3, 4)

Dim ZeroArray(0 To 5) ' здесь явно указаноа нижняя граница индекса.

Lower = LBound(MyArray) ' функция возвращает значение нижней границы массива =1

Lower = LBound(TwoDArray, 2) ' вернет 1.

Lower = LBound(ZeroArray) ' вернет 0.

Можно переописывать массив неоднократно.

ReDim [Preserve] имямассива (границы) [As type]

Здесь важно, что можно изменять границы индексов. Но самое интересное это то, что можно потребовать сохранить все значения в «старых» элементах (Preserve). При применении слова Preserve можно изменять только последнюю размерность.

ReDim X(10, 10, 10)

. . .

ReDim Preserve X(10, 10, 15)

Еще один важный момент: память, выделенная под статический массив, то есть массив, количество элементов которого задано в инструкции Dim, освобождается только по завершению процедуры или функции, в которой этот массив описан. Если массив описан на уровне модуля, то память, занятая им, освобождается по закрытию документа. Такая расточительность кажется неприемлемой. Для динамических массивов есть замечательная инструкция Erase, которая освобождает память, занятую массивом.