Локализация (области видимости) имен. Глобальные и локальные объявления.
Вызов процедур и функций
Begin
Begin
CircleS:=Pi*R*R
End;
В этой функции один формальный параметр-значение и один результат, возвращаемый через имя функциии.
Пример: процедура для нахождения действительных корней квадратных уравнений вида ax2+bx+c.
Procedure SqEqRoots(a,b,c:Real;Var x1,x2:Real;Var Err:Boolean);
Var d:real;
d:=b*b-4*a*c; {вычисление дискриминанта}
If d>=0 then begin
d:=sqrt(d);
x1:=(-b-d)/(2*a);x2:=(-b+d)/(2*a);
Err:=False End
else Err:=true
End;
В этой процедуре через параметры-значения передаются коэффициенты квадратного уравнения, через параметры-переменные возвращается результат. Если уравнение имеет действительные корни, они возвращаются через параметры-переменные x1 и x2, а параметр-переменная Err, используемая как признак ошибки, будет иметь значение False. Если у уравнения нет корней, признак ошибки будет иметь значение True, а содержимое переменных x1 и x2 не изменится. В процедуре использована стандартная функция sqrt, которая вычисляет квадратный корень из аргумента (фактического параметра). Подробнее стандартные функции рассмотрены далее.
Синтаксис вызова процедур и функций одинаков:
<вызов процедуры или функции>::= <имя процедуры или функции> ["(" <фактический параметр> {";" <фактический параметр> ")"].
Как отмечалось ранее, отличие состоит в том, что вызов процедуры – это отдельный оператор, а вызов функции – это частный случай фактора (сомножителя) в выражении.
Типы, количество и последовательность фактических параметров должны соответствовать описаниям в списке формальных параметров.
Пример. Если в программе описаны переменные V, D, h типа Real и функция CircleS из примера в предыдущем пункте, можно вычислить объем цилиндра диаметром 0,8 метров и высотой 1,2 метра следующим образом:
D:=0.8; h:=1.2; {Задаются исходные данные}
V:=h*CircleS(D/2); {Вычисляется объем цилиндра}
Во второй строке в функцию CircleS передается радиус, как диаметр, деленный пополам. Результат выполнения функции CircleS (площадь круга в основании цилиндра) умножается на высоту цилиндра h, и значение объема заносится в переменную V.
Если в каком-то блоке определено имя программного элемента (константы, типа данных, переменной, процедуры или функции), это имя можно использовать для доступа к объекту от места, где оно определено, до конца соответствующего блока. В том числе, во всех блоках, вложенных в этот блок, по этому имени будет доступен тот же самый объект.
Имя, определенное во вложенном блоке, во внешнем блоке недоступно.
Если во вложенном блоке определен элемент с таким же именем, которое было назначено другому элементу во внешнем блоке, то во внешнем блоке по этому имени доступен элемент, объявленный во внешнем блоке, а во вложенном блоке доступен элемент, объявленный во вложенном блоке.
Имя функции считается объявленной переменной внутри этой функции, используемой для возврата результата из функции.
Таким образом, любой элемент, объявленный в блоке программы, доступен всем процедурам и функциям, объявленным в той же программе после этого элемента. Такие элементы называют глобальными.
Элементы, объявленные в процедуре или функции, доступны только внутри соответствующей процедуры или функции, а также в процедурах и функциях, вложенных в эту процедуру или функцию после места объявления соответствующего элемента. Они не доступны в блоке программы и в других процедурах и функциях, вложенных непосредственно в блок программы. Такие элементы называют локальными.