Структура программы
Программа 20.17. Использование именованных аргументов.
Sub
Test2()
Dim
bookshops(1
To
25)
As
Integer
Dim
result
As
Boolean
Init bookshops
result = SaleAbility(arr := bookshops, numOfBooks := 3000)
MsgBox(result)
End
Sub
При описании синтаксиса объявления процедуры мы вскользь упомянули ключевое слово ParamArray, настало время уделить ему достойное внимание. Возможность передавать процедуре заранее неизвестное число фактических параметров является опять-таки уникальной по отношению ко многим другим языкам программирования.
Например, мы создадим процедуру подсчета общего количества заявок с использованием параметра ParamArray. При вызове этой процедуры в процедуре Tests можно задавать сколько угодно фактических параметров массива заявок.
Программа 20.18. Использование параметра ParamArray.
Sub
FullSum(
ParamArray
arr()
As
Variant
)
Dim
sum
As
Integer
For
i = LBound(arr)
To
UBound(arr) sum = sum + arr(i)
Next
i
MsgBox(sum)
End
Sub
Sub
Test3()
FullSum 100, 2000, 350, 450
End
Sub
Рассмотрим еще один способ вызова процедур или функций – рекурсивный вызов, т. е. вызов, при котором процедура вызывается из своего же тела. Стандартный пример рекурсивной функции – вычисление факториала.
Программа 20.19. Рекурсивный вызов функции.
Function
fCTRL(n
As
Integer
)
As
Variant
If
(n <= 1)
Then
fCTRL = 1
Else
fCTRL = n * fCTRLfn - 1)
End
If
End
Function
Sub
Test4()
MsgBox fCTRL(20)
End
Sub
Как правило, рекурсивными вызовами не стоит злоупотреблять, поскольку при рекурсивных вызовах достаточно быстро заполняется стековая память компьютера и на их обработку тратится гораздо больше времени. В нашем случае можно избежать использования рекурсивного вызова его заменой на обыкновенный цикл. Хотя, безусловно, есть ситуации, когда использование рекурсивных методов заметно ускоряет работу, например при работе с древовидными структурами данных.
В заключение мы рассмотрим пример, показывающий различие между передачей параметров по ссылке и по значению, в котором приведены две процедуры: RefVal и MainCalc. Вспомогательная процедура RefVal использует три формальных аргумента, описанные по-разному. Далее в теле этой процедуры каждый из них увеличивается на единицу, а затем их значения выводятся на экран. Основная процедура MainCalc устанавливает значения переменных а, b и с, а затем передает их в качестве параметров процедуре RefVal. При этом первый параметр передается по ссылке (по умолчанию), второй – по значению, а третий – снова по ссылке. После возврата из процедуры RefVal основная процедура также выводит на экран значения трех переменных, передававшихся в качестве параметров. Всего на экран выводится шесть значений. Сначала это числа 11, 21 и 31 (все полученные значения увеличились на 1 и выводятся процедурой RefVal). Затем это числа 11, 20 и 31 (эти значения выводятся процедурой MainCalc, причем переменные, переданные по ссылке, увеличились, а переменная, переданная по значению, – нет).
Программа 20.20. Разница между ByRef и ByVal
Sub
RefVal(x,
ByVal
y,
ByRef
z)
x = x + 1
y = y + 1
z = z + 1
MsgBox(x)
MsgBox(y)
MsgBox(z)
End
Sub
Sub
MainCalc 0 a = 10 b = 20 c = 30
Call
RefVal(a, b, c)
MsgBox(a) MsgBox(b) MsgBox(c)
End
Sub
Итак, мы рассмотрели работу с процедурами и функциями, определяемыми пользователем, но помимо этой возможности, есть широкий набор всевозможных встроенных процедур и функций, позволяющих программисту не задумываться над реализацией стандартных операций, таких как сравнение строк или взятие синуса от некоторого числа. К сожалению, рамки нашей книги не дают возможность описать даже малую часть встроенных процедур и функций (да это и ни к чему), но вы всегда сможете найти их полный перечень и описание во встроенной справке Outlook.