Область видимости идентификаторов

Процедуры или функции, как выше сказано, могут содержать внутри себя описание других переменных. Более того, процедуры и функции могут содержать внутри себя описание других процедур и функций, а те в свою очередь – описания других переменных, процедур и функций и т.д. Отсюда возникает проблема определения области действия переменных. Дадим определение: область действия описания конкретного идентификатора называют его областью видимости. Приведем следующие правила определения области видимости идентификаторов (переменных).

1. Глобальными переменными называются переменные, описанные в головной программе. Они доступны в любом ее месте и во всех ее подпрограммах.

2. Подпрограмма описывается в некотором описательном разделе назовем его внешним и сама имеет описательный раздел - назовем его внутренним. Локальные переменные - это переменные, описанные в процедурах и функциях, они доступны во всех частях данной подпрограммы и в любых внутренних описательных разделах, но недоступны в тех блоках программы, которые соответствуют внешним описательным разделам.

На рисунке 11.1 приведена структура программы с вложенными подпрограммами: в головную программу вложена процедура 1 и процедура 2. В свою очередь в процедуру 1 вложена функция 1.

Во всех процедурах и функциях этой программы будут видны и можно использовать глобальные переменные головной программы. Локальные переменные функции 1 и процедуры 2 не будут видны в процедуре 1 и в головной программе. Однако локальные переменные, описанные в процедуре 1, будут видны, также как и глобальные переменные, в функции 1 (она вложена в процедуру 1).

 

Рис. 11.1

 

В следующем примере процедура prog1 вложена в головную программу p11_2. В эту процедуру вложена, в свою очередь, процедура prog2.

Пример:

 

program p11_2;

var х: Integer ; { глобальная переменная }

 

procedure prog1; { Начало описания процедуры prog1}

var у: Integer; { локальная переменная }

 

procedure prog2; { Начало описания процедуры prog2 }

var z: Integer; { локальная переменная }

begin

{ Тело процедуры ргоg2: доступны переменные х, у, z }

…………..

end;

 

begin

{ тело процедуры prog1: доступны переменные х, у }

………………

end;

 

begin

{ тело головной программы: доступна переменная х }

…………..

end.

Задача: написать функцию для возведения целых чисел в натуральную степень.

program р11_3;

{ Описание процедуры Istep }

procedure Istep(x, n: integer ; Var p: Longint);

{ x - целое число, n - натуральная степень, р – результат выполнения

процедуры, т.е. х в степени n. Этот параметр передаётся по ссылке }

var i : integer; { локальная переменная }

begin

p : = x ;

for i: = 2 to n do p := p * x;

end; { конец процедуры Istep }

 

var { описание глобальных переменных }

k: Longint;

begin { тело головной программы }

Istep(3, 3, k); { обращении к процедуре Istep. Первые два фактических

параметра равны 3. Фактическая переменная k, передаваемая

в процедуру по ссылке, после выполнения процедуры будет

содержать результат: 3 в степени 3. }

Writeln('3 в степени 3=' , k);

pstep (5, 6, k) ; { обращении к процедуре Istep }

Writeln('5 в степени 6=' , k);

pstep (7, 4, k); { обращении к процедуре Istep }

Writeln('7 в степени 4=' , k);

end.

12 Файлы