|
Программирование >> Проектирование интерфейса пользователя
При попытке изменить длину массива фиксированного размера, т.е. массива, объявленного с помощью служебного слова Dim с указанием размера, произойдет ошибка. Решить эту проблему можно, объявив массив с помощью ReDim и оставив скобки пустыми (а лучше не задавайте размер массива при его объявлении). Массивы фиксированного размера Количество элементов массива фиксированного размера задается в конструкции его объявления. На протяжении всего сеанса работы программы число элементов такого массива остается постоянным. Объявление массива фиксированного размера отвечает синтаксическому выражению, приведенному выше, за тем исключением, что значение ИсходныйРазмер должно быть указано обязательно. Текст листинга 12.1 содержит пример объявления и использования массива фиксированного размера. Листинг .1. Пример использования массива фиксированного размера 1: Sub FixedArray{ ) 2: Dim Ints(lOO) As Integer 4: Инициализация элементов массива 5: For I = 1 To 100 6: Ints(I) = I 7: Next I 9: For I = 100 to 1 Step -1 10: Debug.Print Ints(I) 11: Next I 12: End Sub Строка 2 содержит выражение объявления массива Ints, предназначен-1 ного для хранения 100 целых чисел. Строки 5-7 демонстрируют конструкцию цикла для итеративного прохождения по всем элементам массива. В практике программирования вам часто придется выполнять начальную инициализацию элементов массивов определенными значениями. Если инициализация не производится, каждому элементу массива по умолчанию присваивается некоторое значение, зависящее от типа: например, числовые элементы будут содержать значение 0, а символьные - null (пустая строка). В строках расположен цикл, позволяющий отобразить содержимое всех элементов массива, начиная с последнего и заканчивая первым, в окне Immediate редактора Microsoft Visual Basic. Мы не случайно остановимся на обоих направлениях перемещения по элементам массива - прямом и обратном. Это важно, поскольку во многих случаях (как, например, при сортировке данных, о чем речь пойдет в одной из последних разделов этой главы) потребуются самые разнообразные способы обработки массивов данных. Динамические массивы Динамическим называется массив, число элементов которого может изменяться во время выполнения программы - в отличие от массива фиксированного размера, определяемого на этапе кодирования. Если для объявления динамического массива исполь- зуется служебное слово Dim, значение в круглых скобках опускается. Существует и другой вариант объявления, предусматривающий обязательное задание размера массива: ReDim ИмяМассива С ИсходныйРазмер ) As ТипДанных Роль признака изменяемости объема массива играет теперь служебное слово ReDim. Все остальное аналогично - идентификатор, число-размер в круглых скобках и обозначение типа данных. При необходимости изменения размера массива после инициализации его элементов следует предусмотреть средства создания резервной копии данных. На первый взгляд, последовательность действий может быть такой: объявить временный массив, скопировать значения массива, подвергающегося изменениям, во временный, выполнить модификацию массива и вернуть значения обратно. Это, однако, не лучший метод - VBA позволяет использовать другой, в котором выражение повторного объявления содержит служебное слово Preserve. Листинг 12.2 содержит пример, иллюстрирующий процедуру изменения размера массива с использованием инструкции Preserve. Листинг 12.2. Пример объявления динамического массива и изменения его размера 3 : 4: 5: б: 7 : 8: 9: 10 : 11 : 12 : 13 ; 14 : 15 : 16 : 17 : Su сАггау( ) ReDim Strings(5) As String ReDim Strings(10) As String Strings (1) = Greetings Strings(2) = Wilkommen Strings (3) = Bienvenido Strings (4) = Привет Strings (5) = Здоровеньк1 були ReDim Preserve gs (30) As Spring Dim Elem As Variant For Each Elem In Strings Debug.Print Elem Next End Sub Анализ Строки 2 и З листинга 12.2 содержат объявления одного и того же массива символьных переменных. Второе объявление просто удлиняет массив до десяти элементов; служебное слово Preserve в данном случае необязательно, поскольку массив пуст. В строках выполняется инициализация пяти первых элементов: обратите внимание на использование индекса в круглых скобках, который указывает на номер текущего элемента массива. Строка 11 содержит инструкцию повторного объявления, предусматривающего увеличение размера массива до 30 элементов и гарантирующего посредством слова Preserve сохранность данных. Цикл, который расположен в строках позволяет удостовериться, что содержимое массива не изменилось. Опасность потери значений подстерегает вас в случае отсутствия директивы Preserve либо уменьшения количества элементов вместо его увеличения. В последнем случае даже Preserve не сможет помочь, ибо нельзя сохранить то, чего заведомо нет. Статические массивы Все статические переменные объявляются внутри процедур или функций. То же справедливо и в отношении статических массивов - т.е. массивов, объявленных с использованием служебного слова Static. Статические объекты данных сохраняют свои значения даже в том случае, когда выполнение функции (подпрограммы) завершилось. Они могут продолжать работу при очередном обращении к той же функции или подпрограмме. Конструкция объявления статического массива отличается присутствием служебного слова Static, например: Static Dim Arrayl (10) As String Если изменить слово Dim на ReDim, статический массив станет еще и динамическим. Статические массивы находят разное применение (во второй части этой главы приводится ряд конкретных примеров). Задание точки отсчета индекса массива В некоторых языках программирования, например С, элементы массивов отсчиты-ваются, начиная с нуля. Другими словами, допустимые значения индекса массива из десяти элементов, определенного в программе на языке С, заключены в интервале от О до 9. VBA позволяет явно указать точку отсчета индексов массивов. Этой цели служит команда Option Base: Option Base 0 1 Команда Option Base должна располагаться в верхней части программного модуля. По умолчанию в качестве базы отсчета принимается значение 0. В этом случае первый элемент любого массива будет адресоваться нулевым значением индекса, а N-Pi - значением N-1. Если вам удобно отсчитывать элементы массива с нуля, положитесь на стандартное поведение системы; в противном случае явно укажите инструкцию Option Base 1. Главное, будьте последовательны в своих решениях. Использование массивов для хранения данных Вполне возможно, что через некоторое время с программным кодом, который вы - к восторгу современников - удосужились написать, придется работать и вашим преемникам. Вероятно, этим счастливчикам не понравится, что в тексте кода вы (не очень предусмотрительно) использовали явные обращения к нулевому или первому элементу массива. Наилучший способ исключения подобной ситуации состоит в использовании специальных средств языка, позволяющих избежать зависимости от выбранной точки отсчета индексов. Существует такая альтернатива: применять циклы вида For Each . . . Next либо обратиться к функциям Lbound и Ubound. Рекомендуется остановить выбор на указанных функциях - если, разумеется, ваш код вообще предусматривает циклические действия над элементами массивов. Синтаксические формулы обращения к функциям Lbound и Ubound таковы: Lbound( ИмяМассива [, Измерение] ) Ubound ( ИмяМассива [, Измерение] )
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |