Когда мы используем процедуры и функции в Паскале, то имеем дело с идентификаторами (т.е. именами) в программе. При составлении программного кода для использования не все имена оказываются доступными.
Доступ к определенному идентификатору в тот или иной момент времени осуществляется в зависимости от того, в каком блоке описан используемый идентификатор.
Помните: формальные параметры функций и процедур всегда представляют собой локальные переменные для тех блоков, где они описаны. Существует два типа идентификаторов: локальные и глобальные идентификаторы Паскаль.
Локальные идентификаторы Паскаль:
Локальные идентификаторы — это имена, которые описаны либо в заголовке, либо в разделе описаний функции или процедуры. Основное правило работы с такими идентификаторами: Локальные идентификаторы являются доступными только лишь в пределах того блока, в котором они описаны.
Этот блок, а также все остальные блоки, вложенные в него, называются областью видимости для соответствующих локальных идентификаторов.
Глобальные идентификаторы Паскаль:
Глобальные идентификаторы — это имена, заключенные в блоке Program, используемом для всей программы. При работе с этим типом идентификаторов следует руководствоваться правилом.
Идентификаторы, которые описаны в одном блоке, могут совпасть с идентификаторами из других блоков, которые либо содержат данный блок, либо вложены в него. Причиной этому является тот факт, что переменные, которые описаны в различных блоках (пусть у них всех одинаковые имена), хранятся в различных областях ОЗУ (оперативная память).
Область памяти, хранящая глобальные идентификаторы, называется сегментом данных программы. Их создание происходит в процессе компиляции, и кроме того они действительны на протяжении всей работы программы. Локальные переменные, в отличие от глобальных, хранятся в области памяти, которая именуется стеком. Они временны, поскольку их создание осуществляется в момент входа в подпрограмму, а уничтожение — в момент выхода из подпрограммы.
Может возникнуть ситуация, когда имя, которое описано в блоке, в случае совпадения «закрывает» те же самые имена из блоков, содержащих данный.
Другими словами, если есть два блока, один из которых вложен в другой, и в обоих блоках содержатся переменные с одинаковыми именами, то после перехода во «внутренний» блок мы будем работать с переменной, локальной для рассматриваемого блока. А переменная с этим же именем, заключенная во «внешнем» блоке, оказывается временно недоступна — это будет продолжаться до тех пор, пока не осуществим выход из «внутреннего» блока. Совет.
Все имена, имеющие в той или иной подпрограмме только лишь вспомогательное назначение, идентифицировать в качестве локальных, что избавляет от опасности изменений глобальных объектов с теми же именами.
Пример. Создадим программу, которая вычисляет значение функции y=a*ln(sin(x))
program log; var d : real; {глобальные параметры} function fun(b,x:real): real; {начало описания функции} var y:real; {локальные параметры} begin y:=b*ln(sin(x)); {вычисление значения заданного выражения} fun:=y; {присвоение имени функции результата вычисления подпрограммы} end; {конец описания функции} begin {начало основной программы} writeln('Введите значение b'); readln(b); writeln('Введите значение x'); readln(x); d:=f(b,x); writein('Значение функции y равно',d); end.