Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual Basic 2005 (word97).doc
Скачиваний:
294
Добавлен:
09.02.2015
Размер:
7.31 Mб
Скачать

11.4. Локальные и глобальные переменные

Переменная, описанная в теле подпрограммы, называется локальной. Ее значение доступно только в той подпрограмме, в которой описана данная переменная. После завершения подпрограммы значение локальной переменной теряется, если эта переменная не была объявлена с помощью оператора Static(см. раздел 11.5).

Глобальная переменная описывается вне всех подпрограмм, в том числе и вне главной (вызывающей) программы. Как правило, глобальные переменные описываются в самом начале модуля, сразу после заголовка модуля или класса. Для описания глобальных переменных используются операторы PrivateиPublic(см. раздел 4.3). В отличие от локальной переменной значение глобальной переменной доступно во всех подпрограммах модуля и всегда сохраняется между вызовами подпрограмм. Но широкое использование глобальных переменных в сложных программах не рекомендуется, так как большое количество глобальных переменных существенно усложняет процесс отладки программы.

Если в пределах одной программы одновременно встречаются глобальная и локальная переменная с одинаковыми именами, то в пределах той подпрограммы, где описана локальная переменная, она всегда будет перекрывать одноименную глобальную переменную.

Рассмотрим пример программы, использующей глобальную переменную. Текст этой программы начинается с объявления глобальной целочисленной переменной n.

Private n As Integer

Затем описываются все необходимые подпрограммы.

Процедура printпредназначена для вывода значения целочисленной переменной в окно списка. У нее два входных параметра:stroka– это поясняющий текст, который будет выводиться перед значением переменной,znach– значение, которое надо вывести. Это значение может быть только целым числом. Так как обе переменных в процессе вывода не меняют своих значений, то они передаются по значению. Перед их именами ставим ключевое словоByVal. Обратите внимание, что по правилам языка Visual Basic 2005 режим передачи указывается отдельно для каждого параметра.

Private Sub print(ByVal stroka As String, _

ByVal znach As Integer)

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

lstA.Items.Add(stroka + Str(znach))

End Sub

Следующая процедура изменяет значение глобальной переменной n. Она на единицу увеличивает значение параметраb, переданного по ссылке, и на единицу уменьшает значение глобальной переменнойn.

Private Sub Test3(ByRef b As Integer)

b += 1

n -= 1

End Sub

Теперь проанализируем главную (вызывающую) программу. В ней мы опишем локальную целочисленную переменную b.

Dim b As Integer

Определим начальное значение для этой переменной.

b = 6

Теперь зададим значение глобальной переменной n.

n = 8

Очищаем окно списка от результатов предыдущих запусков программы.

lstA.Items.Clear()

Выводим поясняющий текст.

lstA.Items.Add("Global")

Используя процедуру print, печатаем начальные значения локальной и глобальной переменных.

print("local b=", b)

print("global n=", n)

Выводим горизонтальную черту, чтобы зрительно отделить исходные данные от полученных результатов.

lstA.Items.Add("----------------------------------")

Вызываем процедуру Test3, чтобы изменить значение локальной переменнойb.

Test3(b)

Полученный результат выводим в окно списка с помощью процедуры print. Для контроля правильности работы программы распечатаем значение глобальной переменнойn.

print("local b=", b)

print("global n=", n)

Еще раз выведем горизонтальную черту, чтобы зрительно отделить первый блок результатов от второго.

lstA.Items.Add("----------------------------------")

Повторно вызовем процедуру Test3, чтобы с ее помощью изменить значение глобальной переменнойn.

Test3(n)

Для контроля правильности работы программы выведем значение локальной переменной bи измененное значение глобальной переменнойn.

print("local b=", b)

print("global n=", n)

Пример работы программы приведен на рис. 72. Проанализируем полученные результаты.

Рис. 72.Глобальные и локальные переменные

В первом блоке выведены начальные значения переменных bиn.

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

Третий блок результатов выводится после второго вызова процедуры Test3. В этом случае мы хотим с помощью процедуры изменить значение глобальной переменнойn, уменьшив его на единицу. Очевидно, что значение локальной переменнойbпри этом не должно изменить. Рассмотрим полученные результаты. Действительно, значение переменнойbосталось прежним. Но и значение глобальной переменнойnне изменилось, хотя мы его передавали в подпрограммуTest3по ссылке и, следовательно, должны были получить результат.

Так проявляется один из побочных эффектов использования глобальных переменных. Что же происходит на самом деле? При переходе в процедуру Test3глобальная переменнаяnподставляется на место формального параметраb. Так как этот параметр передается по ссылке, то все его изменения будут сохранены в памяти компьютера. Таким образом, операторb += 1изменяет значение глобальной переменнойn, которая, являясь фактической переменной при вызове подпрограммы, подставляется вместо формального параметраb. После этого оператора значение переменнойnстановится равным 8. Но следующая строка процедурыTest3изменяет значение глобальной переменнойn, уменьшая его на единицу:n -= 1. В результате значение переменнойnснова становится равным 7. Очевидно, что с точки зрения главной (вызывающей) программы никакого изменения глобальной переменнойnв процедуреTest3не происходит.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]