При создании программ, использующих процедуры, следует учитывать, что
все объекты (метки, константы, типы, переменные, процедуры, функции),
которые описываются после заголовка процедуры, называются локальными
объектами и доступны только в пределах этой процедуры, но недоступны
вызывающей программе. Все эти объекты создаются при входе в процедуру и
уничтожаются при выходе из нее. Если одно и тоже имя определено в
нескольких процедурах, вызываемых одной и той же программой, то в
каждой процедуре этому имени соответствует свой локальный объект.
Все объекты, описанные в вызывающей программе, называются глобальными и
являются доступными внутри процедур, вызываемых этой программой.
Поэтому обмен данными между программой и ею вызываемой процедурой может
производиться и через глобальные переменные. Если одно и то же имя
определено и в программе, и в вызываемой ею процедуре, то ему
соответствует глобальный объект, но внутри процедуры глобальный объект
недоступен, он как бы экранируется (маскируется) локальным объектом с
таким же именем.
В Турбо Паскале допускается любой уровень вложенности процедур и
функций. Процедура, описанная в основной программе, в свою очередь,
может иметь описания внутренних процедур и функций и т.д. При этом
объекты, описанные в вызывающей процедуре, являются глобальными по
отношению к вызываемой процедуре.
Можно схематически изобразить структуру блоков некоторой
Паскаль-программы
Для доступа к объектам, описанным в различных блоках, требуется
соблюдение следующих правил:
- имена объектов, описанных в некотором блоке, считаются известными в
пределах данного блока, включая и все сложные блоки.
- имена объектов, описанных в блоке, должны быть уникальны в пределах
данного блока и могут совпадать с именами объектов из других блоков.
- если в некотором блоке описан объект, имя которого совпадает с именем
объекта описанного в объемлющем блоке, то это последнее имя становится
недоступным в данном блоке (оно как бы экранируется одноименным
объектом данного блока).
Если применить эти правила к приведенной схеме, можно сказать, что
объекты, описанные в блоке В, известны (видимы) кроме самого блока В
еще и в блоках С и D, но невидимы в блоке А. Объекты, описанные в блоке
F, известны только в пределах этого блока.
Например:
Program Exampl;
Procedure P;
Procedure A;
Var j : integer; {локальная переменная j, является
глобальной по отношению к процедуре В}
Procedure B;
Var j : integer; { локальная переменная j, экранирует глобальную
переменную j, описанную в вызывающей процедуре А}
Begin
Writeln (j);
End;
Begin J:=1;
B; {вызов процедуры В}
End;
Begin
A; {вызов процедуры А}
End.
Иногда при вызове подпрограмм-функций возникают побочные эффекты,
выражающиеся в том, что вносят нежелательные изменения в значения
глобальных переменных. Поэтому будьте внимательны при описании
параметров-переменных, при выборе имен учитывайте наличие глобальных
объектов с такими именами.