Механізми передачі параметрів.

Виконуючи інструкцію виклику підпрограми з параметрами, транслятор здійснює, так звану передачу параметрів у підпрограму. Для розуміння суті цього процесу важливо розрізняти формальні і фактичні параметри.

  • Формальним параметром (аргументом) процедури чи функції називають змінну, записану в списку аргументів при описі процедури (функції). Формальні параметри використовують для формального запису дій, які повинна виконати підпрограма із конкретними даними, які вона отримуватиме під час виклику з основної програми.
  • Фактичним параметром (аргументом) процедури чи функції називають конкретне значення, яке вона отримує під час виклику з основної програми і з яким виконує закладені в собі дії.

Теоретично у програмуванні розрізняють шість способів передачі фактичних параметрів у підпрограму, у OOo Basic (Visual Basic, VBA) реалізовано два з них: за значенням (ByVal) та за адресою (ByRef).

Під час передачі за значенням у підпрограму передається лише значення фактичного параметра, відповідно, зміни такого параметра всередині підпрограми не помітні у основній програмі. Фактичним парметретром, що передається за значенням, може бути як змінна, так і рядкова або іменована константа, або навіть деякий вираз, результат обчислення якого передається в підпрограму.

Під час передачі за адресою (посиланням) у підпрограму передається не саме значення а фізична адреса змінної — фактичного параметра. У цьому випадку підпрограма працює із переданою змінною як із власною, і результат цієї роботи можна побачити у основній програмі. Фактичним парметром, переданим за адресою може бути лише змінна, якщо параметрам описаним з ключовим словом ByRef передати константу або значення виразу (які не мають фізичної адреси у пам’яті ПК), то Basic буде працювати зними, як із параметрами-значеннями.

Спосіб передачі параметрів вказується на етапі опису підпрограми у списку її формальних параметрів за допомогою ключових слів ByVal(передача за значенням) та ByRef(передача за посиланням) перед іменем кожного формального параметра. Якщо спосіб передачі для формального параметра не вказується, то використовується спосіб передачі за замовчуванням, яким в усіх версіях Visual Basic закладено спосіб за посиланням (ByRef). Наприклад, заголовок

Sub Main( ByRef x As Single, ByVal y As Single, s As String)

декларує процедуру Main з трьома параметрами, два з яких, x та s, повинні отримувати значення за посиланням (ByRef).
Ще одне ключове слово, яке можна застосовувати до опису формальних параметрів підпрограми — Optional. Його використовують для позначення так званих необов’язкових параметрів процедур та функції. При виклику підпрограми необов’язковому аргументу можна не передавати жодного значення, залишаючи його місце у списку фактичних парамертів порожнім. Щодо необов’язкових аргументів підпрограм OpenOffice.org Basic дещо відрізняється від VBA (та Visual Basic): у VBA необов’язковими вважаються лише параметри позначені словом Optional, а в OOo Basic до них належать також параметри, що містяться у списку формальних парамертів підпрорами, але не використовуються її інструкціями.

Під час виклику підпрограми список її фактичних параметрів повинен однозначно відповідати за кількістю, порядком та типами даних спискові формальних параметрів. Це фундаментальне правило структурного програмування у Visual Basic суттєво порушується за рахунок використання необов’язкових параметрів, що, в свою чергу ускладнює написання макросів з використанням підпрограм. Для усунення цього недоліку пердбачено використання, так званих, іменованих аргументів (named arguments), яке полягає у записі списку фактичних за правилом:

<ім'я формального параметра>:=<фактичний параметр>

Використання механізму іменованих аргументів дозволяє задавати фактичні параметри для підпрограм у довільній послідовності, оскільки він однозначно вказує якому формальному параметру передається конкретне фактичне значення.