-
Область видимости идентификаторов
Областью видимости идентификатора называется часть программы, где он может быть использован. Область видимости идентификатора определяется местом его объявления и носит относительный характер.
Основные правила видимости идентификаторов
-
Если идентификатор описан в разделе описаний основной программы, то он является глобальным. Его могут использовать все процедуры и функции этой программы.
-
Если идентификатор описан внутри подпрограммы, то он является локальным и доступен только внутри этой подпрограммы.
-
Если имя глобального идентификатора совпадает с именем локального, то внутри подпрограммы действует локальный идентификатор, то есть объявление локального идентификатора внутри подпрограммы отменяет действие глобального.
-
Если в подпрограмме описаны другие подпрограммы (процедуры или функции), то область видимости описанных в ней идентификаторов распространяется и на эти вложенные подпрограммы. Идентификаторы, описанные в данной подпрограмме, являются глобальными для вложенных в нее подпрограмм.
-
Обмен данными между программой и подпрограммами
Обмен данными между основной программой и подпрограммами может выполняться следующими путями:
-
с помощью глобальных переменных;
-
через параметры;
-
через возвращаемое значение (для функций).
Обмен данными с помощью глобальных переменных
Глобальные переменные доступны внутри любой подпрограммы, где нет одноименных локальных переменных. Но использовать данный способ не рекомендуется, так как это затрудняет отладку и делает подпрограмму зависимой от остальной программы (невозможность выделить подпрограмму в отдельный библиотечный модуль).
Передача данных через параметры
В заголовке любой подпрограммы (процедуры или функции) может содержаться список параметров. Эти параметры предназначены для обмена данными между подпрограммой и основной программой. Операторы тела подпрограммы рассматривают список параметров как продолжение раздела описаний. Все переменные из этого списка могут использоваться в выражениях внутри подпрограммы.
Параметры, указываемые в заголовке подпрограммы при ее описании, называются формальными параметрами.
Параметры, указываемые при вызове подпрограммы, называются фактическими параметрами.
При вызове подпрограммы обязательно должно соблюдаться соответствие между формальными и фактическими параметрами, то есть подпрограмме должно быть передано столько параметров, сколько указано в ее заголовке; типы фактических параметров должны соответствовать типам формальных параметров.
Существует два способа передачи параметров
-
по значению (параметры-значения)
-
по ссылке или по адресу (параметры-переменные).
Заголовок процедуры с параметрами-значениями имеет вид:
Procedure Имя(параметр1,параметр2:тип1; … параметрN:типN);
При вызове процедуры в ячейки памяти формальных параметров (параметр1 … параметрN) передаются копии соответствующих фактических параметров, поэтому никакие действия в теле процедуры не в состоянии изменить значения фактических параметров.
В качестве фактических параметров-значений могут использоваться константы, переменные или выражения.
Заголовок процедуры с параметрами-переменными имеет вид:
Procedure Имя(var параметр1,параметр2:тип1; … var параметрN:типN);
При вызове в процедуру передается адрес фактического параметра, поэтому выполнение операторов в теле процедуры может привести к изменению значения фактического параметра (возврат результата).
В качестве фактических параметров в этом случае можно использовать только переменные. Использование констант, выражений и непосредственных значений не допускается.
Пример – Программа, содержащая процедуру для обмена значениями между двумя переменными.
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 параметрN:типN);
Пример – Программа, содержащая процедуру вывода на экран фамилии автора.
Program Avt;
Uses CRT;
Const
Avtor='Иванов И.П.'; {ФИО автора}
{Процедура вывода ФИО автора}
Procedure PrintAvtor(Const A:String);
Begin
WriteLn('Программу разработал:',A);
End;
BEGIN
PrintAvtor(Avtor);
ReadLn;
END.