ЛАБОРАТОРНАЯ РАБОТА № 6
«Динамические массивы»
Цель работы:
Применить на практике знания:
Ø объявлению, инициализации, использованию динамических массивов
КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Динамические массивы используются в том случае, когда количество элементов массива заранее неизвестно, а определяется в процессе выполнения программы. По окончании работы с динамическим массивом можно освободить память, которую он занимает. Это важно для задач, требующих большого объема оперативной памяти.
Объявление динамического массива
Описание динамического массива осуществляется в два этапа.
1. Объявляется массив с использованием оператора Dim, но без указания размерности. Признаком массива являются скобки после его имени.
Dim имя_переменной () [As тип]
2. В нужном месте программы описывается данный массив с указанием размерности при помощи оператора ReDim, причем в качестве границ можно использовать не только целые числа, но и арифметические выражения. Важно, чтобы к моменту выполнения оператора ReDim все переменные в этих арифметических выражениях имели числовые значения.
Оператора ReDim для динамического массива можно вызывать несколько раз, изменяя либо границы индекса либо задавать массив другой размерности. При этом необходимо помнить, что старые значения элементов массива теряются.
Например:
DimM() 'Объявляем динамический массив
...
ReDim M(5) 'Определяем одномерный массив из 6 элементов
...
ReDim M(1 To 11) 'Переопределяем массив М как одномерный из 11 элементов
...
ReDim M(1 TO 3, 1 To 4) 'Переопределяем массив М как двумерный _
из 3 строк и 4 столбцов
Ключевое слово Preserve
Следует иметь в виду, что при каждом выполнении оператора ReDim (т.е. при каждом переопределении массива) значения элементов массива будут потеряны, т.к. оператор ReDim обнуляет все элементы массива.
|
Для того чтобы при переопределении массива значения элементов не пропали, следует использовать ключевое слово Preserve.
Особенности использования ключевого слова Preserve:
Ø при сокращении размеров массива данные, оказавшиеся за пределами его новых размеров, будут потеряны.
Ø размерность массива не может быть изменена;
Ø в многомерных массивах можно менять только верхнюю границы последнего «измерения» массива.
Задание: произведите пошаговое выполнение программы Сохранение2, наблюдая за значениями элементов массива аrrА с помощью окна Watches (Контрольные значения).
Определение границ индексов массива
Существует возможность определения значений нижней и верхней границ массива любой размерности. Для этого следует использовать функции LBound и UBound соответственно.
LBound(arrayname[, dimension])
UBound(arrayname[, dimension]),
где arrayname – имя массива, dimension – номер измерения.
Например
Использование функций LBound и UBound для определения границ одномерного массива аrrА:
Dim Low As Long
Dim Up As Long
Low = LBound(arrA) 'Low - нижняя граница массива
Up = UBound(arrA) 'Up - верхняя граница массива
Функция UBound необходима, например, когда значение верхней границы одномерного массива неизвестно и при этом необходимо увеличить это значение на определенное число.
Dim Lower, Upper
'объявляем переменные массива
Dim MyArray(1 To 10, 5 To 15, 10 To 20)
Dim AnyArray(10)
Lower = Lbound(MyArray, 1) ' возвращает 1.
Lower = Lbound(MyArray, 3) ' возвращает 10.
|
Lower = Lbound(AnyArray) 'возвр. 0 или 1, в завис. от знач.Option Base
Upper = UBound(MyArray, 1) ' возвращает 10.
Upper = UBound(MyArray, 3) ' возвращает 20.
Upper = UBound(AnyArray) ' возвращает 10.
Оператор Erase
Как говорилось выше, преимуществом динамического массива перед статическим является то, что оперативная память, занимаемая динамическим массивом, может быть освобождена. Для этого используется оператор Erase.
ПРИМЕРЫ
Пример 1:
Option Base 1
Sub Сохранение()
Dim A() As Integer 'объявление массива
Dim N As Byte, I As Byte
Dim st As String
N = InputBox("Введите размерность массива:")
ReDim A(N) 'указание размерности
For I = 1 To N
A(I) = 2 * I
Next I
' Массив расширяется с сохранением ранее вычисленных элементов
ReDim Preserve A(2 * N) 'указание новой размерности
For I = N + 1 To 2 * N
A(I) = 3 * I
Next I
For I = 1 To 2 * N
st = st & A(I) & " "
Next I
MsgBox "Элементы массива:" & Chr(13) & st
End Sub
В этом примере объявляется динамический массив A. Его размерность вводится с клавиатуры. Далее элементам массива присваиваются значения: 2*индекс. Затем в программе указывается новая размерность массива – 2*N, при этом сохраняются старые значения. Новым элементам присваиваются значения: 3*индекс.
Упражнение.
Выполните макрос Пример1, изменив оператор
ReDim Preserve arr(2 * N)
на
ReDim A(2 * N).
Пример 2:
Sub Память()
Dim A() As Byte
Dim B() As Byte
ReDim A(8) 'Память для А: 9 * 4 + 20 = 33 байта
Erase А 'Память для А: 0 байтов
ReDim B(2, 2) 'Память для В: 9+8+20=37 байтов
End Sub
Задание: после ввода программы память в окно кода нового модуля выполните следующее.
1. Дважды выполнив Debug (Отладка)ðAdd Watch (Добавить контрольное значение), в окне Watches(Контрольные значения)сгенерируйте строки, соответствующие массивам А и В.
|
2. Кликните в любом месте текста программы для установки там мигающего курсора.
3. Произведите пошаговое выполнение программы Память, наблюдая за распределением памяти с помощью окна Watches (Контрольные значения).