Тайны и секреты компьютера | страница 24



то никакого увеличения переменной «a» не произошло бы и программа отобразила бы в качестве результата число 1. Однако в самой процедуре uvelich соответствующая переменная увеличилась бы на 3 и, если бы последняя ее команда была бы MsgBox b, то она отобразила бы значение 4.

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

Sub Main()

Dim a As Integer

Dim d As Integer

a = 1

d = uvelich(a, 3)

MsgBox d

End Sub


Function uvelich(ByVal b As Integer, ByVal c As Integer) As Integer

uvelich = b + c

End Function

Как нетрудно видеть, программа присваивает переменной «d» значение, вычисленное функцией.

При создании функций опять-таки следует помнить, что если в заголовке функции не указана инструкция ByVal перед описаниями переменных, то соответствующие переменные могут быть в функции изменены и после ее выполнения в исходной программе они будут иметь уже измененные значения. Так, если бы данный пример имел вид

Sub Main()

Dim a As Integer

Dim d As Integer

a = 1

d = uvelich(a, 3)

MsgBox d

MsgBox a

End Sub


Function uvelich(b As Integer, c As Integer) As Integer

uvelich = b + c

b=1555

End Function,

то программа бы в качестве значения переменной «а» отобразила бы число 1555, а не 1.

Указания типов переменных в заголовках функций и процедур необязательны — их можно опустить. В этом случае будет считаться, что все передаваемые переменные могут иметь любой тип (точнее, они просто преобразуются в тип Variant и такими уже используются в подпрограмме). Однако необходимо строго следить за соответствием типов переменных в заголовках подпрограмм и в вызывающей их программе. Так, если в заголовке функции указано, что первая переменная, передаваемая ей, имеет тип Integer, то та переменная, которая передается в функцию как первая (в последнем примере — "a"), должна быть определена именно как Integer до вызова функции (что мы и видим в этом примере).

Перед заголовком функции или процедуры можно поставить инструкции Public или Private ("Private Function uvelich(b As Integer, c As Integer) As Integer"). Функция или процедура, объявленная как Public, может вызываться и из других модулей, в то время как функция или процедура, объявленная как Private, доступна только из данного модуля.

По умолчанию все функции и процедуры считаются объявленными как Public (а переменные — объявленные как Private!).