Программирование >>  Проектирование интерфейса пользователя 

1 ... 61 62 63 [ 64 ] 65 66 67 ... 153


Обе функции требуют наличия, как минимум, одного аргумента - имени массива. Второй (необязательный) параметр Измерение, указывает номер измерения массива, для которого необходимо вычислить значение верхней или нижней границы изменения индекса. Если аргумент Измерение не задан, по умолчанию предполагается, что речь идет о первом измерении массива.

Значение, установленное командой Option Base, не оказывает влияния на порядок отсчета номеров измерений массива - они всегда перечисляются, начиная с единицы.

Далее рассмотрим два массива - двухмерный и трехмерный:

DimArrayKS, 20) As String Dim Array2(5, 5, 10) As Integer

Первый массив, Arrayl, двухмерный. Такие массивы называют матрицами. Второй, - это трехмерная матрица. (В принципе, матрицей можно назвать даже п-мерный массив.) Массив Arrayl содержит 100 индексированных ячеек для хранения символьных значений. Если вызвать функцию Ubound, передав ей единственный параметр Arrayl, она возвратит значение 5. Результатом обращения

Ubound( Arrayl, 2 ) будет число 20.

Функции Lbound и Ubound гарантируют, что востребованное программой значение индекса массива находится в допустимом диапазоне. Функции удобно применять в качестве границ изменения переменной цикла - убедитесь в этом, прочитав текст листинга 12.3.

Листинг .3. Пример объявления многомерного массива и использования функций Lbound и Ubound

10 11: 12 13 : 14

Sub DisplayBoundsI

Dim I As Integer

Dim Arrayl(5, 10) As Integer

Dim Array2(100) As Integer

Debug.Print UboundI Debug.Print Uboundi

Arrayl, 2 Array2 )

For I = Lbound(

Array2(I) Next I

End Sub

Array2 ) To Ubound ( Array2 = I: Debug.Print array2(I)

. Анализ

Строка 4 листинга 12.3 демонстрирует объявление массива, содержащего 5 индексированных ячеек в первом измерении и 10 - во втором. Таким образом, массив Arrayl способен хранить 50 целых чисел. В строке 5 объявлен одномерный массив предусматривающий возможность хранения 100 целочисленных значений. Строка 7 иллюстрирует применение функции Ubound для получения объема второго измерения массива Arrayl, а результатом вычисления выражения, расположенного в строке 8, будет длина единственного (первого) измерения массива Аггау2. Строки 10-12 кода содержат пример цикла For . . . Next, в котором границы изменения индекса задаются с помощью функций Lbound И Ubound.



Использование функции und und можно отнести к образцам хорошего стиля программирования, гарантирующего надежность и переносимость кода в условиях динамического изменения размеров массивов. Даже если со временем понадобится исправить в программе конструкции объявлений массивов, циклы обновлять не придется.

Приведенный ниже листинг 12.4 иллюстрирует приемы циклической обработки элементов многомерного массива. Следует отметить, что вполне допустимы операции обращения к любому измерению массива, и, как правило, они связаны со значительными издержками в отношении скорости работы программы, поскольку циклы по необходимости становятся вложенными. С увеличением числа измерений массива вычислительная сложность алгоритмов циклической обработки возрастает по экспоненциальному закону. Показатели быстродействия ухудшаются и при значительном росте количества элементов в каждом измерении; в этом случае также существенно повышаются требования к объему свободной памяти.

Предположим, что на обработку одного элемента массива затрачивается одна секунда (разумеется, это условно). Если массив содержит два измерения по 100 элементов в каждом, на выполнение операций со всеми элементами потребуется 10000 секунд. Добавление

в массив еще одного измерения той же протяженности приведет к возрастанию времени обработки на два порядка, т.е. до 1000000 секунд. (Мы уже не упоминаем о затратах оперативной памяти, необходимой для хранения такого числа объектов данных.) Решив объявить многомерный массив, примите к сведению аргументы, изложенные выше.


В примере предыдущего абзаца единицы времени взяты условно. Кроме того, существуют алгоритмы, обрабатывающие данные значительно эффективнее, чем вложенные циклы.

Листинг 12.4. Пример процедуры обработки многомерного массива

Option Base 1 2: Su nsions ( )

3: Dim Two D Array(10, iO) As String i; Dim I As Integer, J As Integer

5: For I = Lbound ( Two D Array, 1 ] To Ubound { Two D Array, 1 ] For J = Lbound{ Two D Array, 2 ) To Ubound( Two D Array, Two D Array(I, J) = I & & J

Debug.Print Two D Array(I, J)

9: Next J

10: Next I 11: End Sub

I Строка З листинга 12.4 содержит объявление двухмерной матрицы размерами 10x10. В строке 4 содержатся определения целочисленных переменных I и J, которые будут использоваться в качестве индексов. Буквы I, J и К традиционно применяются с подобной целью в математике, поэтому они уместны и в тексте программы. (Следует напомнить: будьте последовательны в своих действиях. Если вы использовали букву I в качестве индекса первого измерения массива в одном месте программы, поступайте так и впредь. Созидательную энергию лучше направить в более полезное русло.) Строка 5 содержит заголовок внешнего цикла For Next, а строка 6 -

внутреннего. В обоих случаях для определения границ интервалов изменения индексов применяются функции Lbound и Ubound. Строка 6 иллюстрирует способ обращения к элементу двухмерного массива. Выражения индексов в круглых скобках разделяются символом запятой.

Массивы с числом измерений, превышающим 1 или 2, используются относительно редко и преимущественно в приложениях математического или технического характера.



Функции дляуправления массивами

В VBA существует еще две нужные функции - Array и Функция

Array возвращает массив, который построен на основании значений элементов, переданных ей в виде списка аргументов. Синтаксис функции Array таков:

▼ Аггау( [Аргумент! [, Аргумент2 [, ... [, Аргументы] ... ] )

Array возвращает массив, содержащий значения, переданные в виде параметров. Если выражение вызова функции не содержит аргументов, возвращается пустой массив.

Функция Erase присваивает каждому элементу массива пустое значение, равноценное null и зависящее от типа массива: для String это пустая строка, для чисел - значение 0, для Variant - Empty, а для массивов объектов - Nothing. После выполнения

операции Erase массивы всех типов, кроме Variant, по-прежнему допускают индексацию. Листинг 12.5 содержит примеры использования функций Array и Erase.


Операции сравнения содержимого элементов массивов различных типов выполняются по-разному. Функция Erase, примененная к массиву типа Variant, приводит к полной очистке массива и присваиванию ему

единого значения Empty. При очистке массива объектов каждый элемент

получает значение Nothing; элементы массива строк становятся равными , а элементы числового массива- 0. Конечно, все это не совсем привлекательно (укоризненный взгляд в сторону Microsoft), но сейчас положение дел именно таково. Поэтому, собираясь вгяснять, пуст тот

или иной массив, не забывайте об указанных выше особенностях.

Листинг 12.5. Примеры использования функций Array и Erase

Sub ArrayFunctions{ ) Dim А( )

A = Array( 1, 2, 3, 4, 5 ) Dim I As Integer

For I = Lbound( A ) To Ubound( A ) Debug.Print A{I)

Next I

Erase A End Sub

Строка 2 листинга 12.5 содержит объявление пустого массива А типа Variant. В строке 3 массив заполняется значениями, указанными при вызове функции Array: 1, 2, 3, 4 и 5. Строки выглядят знакомым образом: здесь объявляется целочисленная переменная цикла и выполняется циклическое отображение содержимого каждого элемента массива в окне Immediate. Строка 8 содержит инструкцию очистки массива Erase, в результате выполнения которой массиву присваивается значение Empty.

Если вы попытаетесь применить функции Lbound или Ubound по отношению к массиву типа Variant, подвергшемуся операции Erase, откроется окно сообщения об ошибке, показанное на рис. 12.2. Но для работы с очищенными массивами всех других типов, включая пользовательские, указанные функции могут применяться.



1 ... 61 62 63 [ 64 ] 65 66 67 ... 153

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика