Локализация (области видимости) имен. Глобальные и локальные объявления.

Вызов процедур и функций

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.

Если в каком-то блоке определено имя программного элемента (константы, типа данных, переменной, процедуры или функции), это имя можно использовать для доступа к объекту от места, где оно определено, до конца соответствующего блока. В том числе, во всех блоках, вложенных в этот блок, по этому имени будет доступен тот же самый объект.

Имя, определенное во вложенном блоке, во внешнем блоке недоступно.

Если во вложенном блоке определен элемент с таким же именем, которое было назначено другому элементу во внешнем блоке, то во внешнем блоке по этому имени доступен элемент, объявленный во внешнем блоке, а во вложенном блоке доступен элемент, объявленный во вложенном блоке.

Имя функции считается объявленной переменной внутри этой функции, используемой для возврата результата из функции.

Таким образом, любой элемент, объявленный в блоке программы, доступен всем процедурам и функциям, объявленным в той же программе после этого элемента. Такие элементы называют глобальными.

Элементы, объявленные в процедуре или функции, доступны только внутри соответствующей процедуры или функции, а также в процедурах и функциях, вложенных в эту процедуру или функцию после места объявления соответствующего элемента. Они не доступны в блоке программы и в других процедурах и функциях, вложенных непосредственно в блок программы. Такие элементы называют локальными.