Область видимості ідентифікаторів
Областю видимості ідентифікатораназивається частина програми, де він може бути використаний. Область видимості ідентифікатора визначається місцем його оголошення і носить відносний характер.
Основні правила видимості ідентифікаторів
Якщо ідентифікатор описаний у розділі описів основної програми, то він є глобальним. Його можуть використовувати всі процедури і функції цієї програми.
Якщо ідентифікатор описаний усередині підпрограми, то він є локальним і доступний тільки усередині цієї підпрограми.
Якщо ім'я глобального ідентифікатора збігається з ім'ям локального, то усередині підпрограми діє локальний ідентифікатор, тобто оголошення локального ідентифікатора усередині підпрограми скасовує дію глобального.
Якщо в підпрограмі описані інші підпрограми ( чипроцедури функції), то область видимості описаних у ній ідентифікаторів поширюється і на ці вкладені підпрограми. Ідентифікатори, описані в даній підпрограмі, є глобальними для вкладених у неї підпрограм.
Обмін даними між програмою і підпрограмами
Обмін даними між основною програмою і підпрограмами може виконуватися наступними шляхами:
за допомогою глобальних перемінних;
через параметри;
через значення, що повертається, (для функцій).
Обмін даними за допомогою глобальних перемінних
Глобальні перемінні доступні усередині будь-якої підпрограми, де немає однойменних локальних перемінних. Але використовувати даний спосіб не рекомендується, тому що це утрудняє налагодження і робить підпрограму залежної від іншої програми (неможливість виділити підпрограму в окремий бібліотечний модуль).
Передача даних через параметри
У заголовку будь-якої підпрограми ( чипроцедури функції) може міститися список параметрів. Ці параметри призначені для обміну даними між підпрограмою й основною програмою. Оператори тіла підпрограми розглядають список параметрів як продовження розділу описів. Усі перемінні з цього списку можуть використовуватися у вираженнях усередині підпрограми.
Параметри, що вказуються в заголовку підпрограми при її описі, називаються формальними параметрами.
Параметри, що вказуються при виклику підпрограми, називаються фактичними параметрами.
При виклику підпрограми обов'язково повинне дотримуватися відповідність між формальними і фактичними параметрами, тобто підпрограмі повинна бути передана стільки параметрів, скільки зазначене в її заголовку; типи фактичних параметрів повинні відповідати типам формальних параметрів.
Існує два способи передачі параметрів
за значенням(параметра-значення)
почи посиланню за адресою (параметрі-перемінні).
Заголовок процедури з параметрами-значеннямимає вид:
Procedure Ім'я(параметр1,параметр2:тип1; … параметр:тип);
При виклику процедури в комірки пам'яті формальних параметрів (параметр1 … параметр) передаються копії відповідних фактичних параметрів, тому ніякі дії в тілі процедури не в змозі змінити значення фактичних параметрів.
Як фактичні параметри-значення можуть використовуватися константи, перемінні чи вираження.
Заголовок процедури з параметр-переміннимимає вид:
Procedure Ім'я(var параметр1,параметр2:тип1; … var параметр:тип);
При виклику в процедуру передається адреса фактичного параметра, тому виконання операторів у тілі процедури може привести до зміни значення фактичного параметра (повернення результату).
Як фактичні параметри в цьому випадку можна використовувати тільки перемінні. Використання констант, виражень і безпосередніх значень не допускається.
Приклад – Програма, що містить процедуру для обміну значеннями між двома перемінними.
Program TestAddr;
Uses CRT;
{Процедура для обміну}
Procedure Obmen(var a,b:Integer);
Var Buffer:Integer;
Begin
Buffer:=a;
a:=b;
b:=Buffer;
End;
{Оголошення глобальних перемінних}
Var
x,y:Integer;
BEGIN
ClrScr; {Очищення екрана}
Write('Увести значення x,y=');
ReadLn(x,y); {Уведення вихідних даних}
Obmen(x,y); {Виклик процедури обміну}
WriteLn('Перемінні після обміну');
WriteLn('x=',x,' y=',y); {Виведення результатів}
ReadLn;
END.
Існує також різновид передачі по посиланню – параметра-константи. Принцип дії такої ж як і у випадку з параметрами перемінними, але зміни параметрів у тілі підпрограми не допускаються.
Заголовок процедури з параметрами-константамимає вид:
Procedure Ім'я(Const параметр1,параметр2:тип1; …Const параметр:тип);
Приклад – Програма, що містить процедуру виведення на екран прізвища автора.
Program Avt;
Uses CRT;
Const
Avtor='Іванов И.П.'; {ПІБ автора}
{Процедура виведення ПІБ автора}
Procedure PrintAvtor(Const A:String);
Begin
WriteLn('Програму розробив:',A);
End;
BEGIN
PrintAvtor(Avtor);
ReadLn;
END.