2.4. Локальные и глобальные описания объектов

Мы уже знаем, что программа - блок, т.е. раздел операторов, снабженный описаниями и имеющий заголовок. Вид блока-программы:

Program имя программы (возможны опции); {опции не обязательны}

Label …; {раздел описания меток}

Const …; {раздел описания констант}

Туре …; {раздел определения типов}

Var …; {раздел описания переменных}

Function …; Procedure …; {раздел описания функций и процедур}

BEGIN ... END. {раздел операторов}.

Функции и процедуры, в свою очередь, также являются блоками:

Procedure имя (список входных формальных параметров);

Var (список выходных формальных параметров);

Label …;

Const …;

Туре …;

Var ...;

function …;

procedure …;

разделы описаний

begin ... end; {тело процедуры}

Таким образом, программа - всегда блок, в который могут быть вложены другие блоки.

Как один из вариантов, возможна следующая структура программы:

Program Prim38; { начало блока 1}
label N,M;
Const k=5.6;
Type d=array[1..10] of integer;
Var b,c:real;
i,j:integer;
z,y:d;

function f(f,b,c:real):real; { начало блока 2}
begin
f:=1;
end; {конец блока  2}

procedure proc(f,b,c:real; Var x,y,z:real); { начало блока 3}
label K,L;
var
d,w,s:real;

function fp(a,b:real):real; { начало блока 4}
begin
fp:=1;
end; {тело fp, конец блока 4}

begin
x:=1;
y:=1;
z:=1;
end; {тело proc, конец блока 3}

BEGIN
b:=1;
END. {тело основной программы, конец блока 1}

Таким образом, программа состоит из четырех блоков. Все имена меток, констант, типов, переменных, функции f и Рrос известны в блоке 1, поскольку они даны в его описании. Считается, что они описаны здесь локально.

В блоке 2 - function - описаний нет, поэтому своих собственных объектов этот блок не имеет. Формальные параметры не в счет, поскольку они служат только для описания алгоритма вычисления результата с именем f в функции f, а ячейки памяти для b, с, f здесь не выделяются. Однако в этом блоке можно использовать все объекты, которые описаны в блоке 1, так как блок 2 является составляющей частью блока 1. Иногда говорят, что имена объектов блока 1 описаны глобально для блока 2.

Аналогичная ситуация и с блоком 3 - Procedure Рrос. Для нее все объекты блока 1 являются глобальными, т.е. доступны. Кроме того, в блоке 3 имеются свои описанные здесь объекты - метки К, L, переменные d, W, 8, функция fp, которые могут быть использованы только в блоке 3 и не известны в блоках 1 и 2.

Как следствие возможно применение одинаковых имен в различных блоках (см. имя d). В блоке 1 d - массив. В блоке 3 (в Рrос) имеется свое d, которое является собственным в блоке 3 и представляет собой не массив, а ячейку памяти типа real.