Пусть, например, в процедуре p параметр y выходной, а действует она следующим тривиальным образом:
procedure p (x: integer; var y: integer);
begin
x := 0;
y := 0
end;
и пусть где-то в программе встретился фрагмент
a := 1; b := 1; p(a,b);
Тогда после выполнения вызова процедуры p(a,b) переменная a будет иметь старое значение 1, а переменная b будет иметь новое значение 0.
Функция отличается от процедуры только тем, что она дополнительно вычисляет некоторое значение, которое возвращает при вызове. В результате возможно использование функций в качестве составной части выражения (а процедуры нет). При вычислении выражения функция вызывается и возвращаемое функцией значение подставляется в выражение. Если функция вызывается через оператор вызова, то возвращаемое значение игнорируется. Помимо возвращаемого значения, функция может выдавать другие выходные данные так же, как это делает процедура (через выходные параметры).
Заголовок функции начинается ключевым словом function и востальном идентичен заголовку процедуры за одним исключением: после списка формальных параметров через двоеточие указывается тип возвращаемого значения (который должен быть простым!):
function
[( )] :
Для того, чтобы обеспечить возврат значения, в Паскале используется следующий механизм: в число переменных автоматически (без объявления) добавляется переменная с именем и типом, совпадающим с именем и типом функции. В конце работы функции этой переменной должно быть присвоено нужное значение. Например, для функции возведения в квадрат
function sqr (x: real): real;
begin sqr := x*x
end;
после присваивания a:=sqr(3) переменная a примет значение 9.
Использование процедур и функций порождает некоторые проблемы в использовании переменных. Рассмотрим операторную часть некоторой процедуры. В ней используются переменные и параметры данной процедуры. Однако не только они. В Паскале полагается, что в операторной части процедуры можно без ограничений использовать переменные самой программы. Более того, если процедура вложена в другую процедуру, то можно использовать переменные и параметры объемлющей процедуры, а если и та вложена – то объемлющей последнюю и т.д. Другими словами, процедуре доступны все переменные и параметры процедур, внутри которых расположен текст данной процедуры. Такие переменные называются внешними в отличие от внутренних переменных самой процедуры. Возможен случай, когда переменные разных процедур имеют одинаковое имя. Тогда при использовании имени будет подразумеваться переменная внутренней процедуры, которая как бы закрывает внешнюю переменную от использования в операторной части внутренней процедуры.
Все сказанное о процедурах относится также и к функциям. Изложенные правила называются правилами локализации имен и относятся не только к переменным. Все объявления в процедуре и функции распостраняются только на текст процедуры и функции, но зато на весь этот текст, включая все вложенные процедуры и функции. Это касается и имен процедур и функций, вложенных в данную. Во внешней процедуре (в частности, в программе) все эти имена недоступны. Например, если процедура G1 содержит процедуру G2, а та содержит процедуру G3, то можно вызвать G3 из операторной части процедуры G2, но нельзя вызвать G3 из операторной части процедуры G1.
Указанные соглашения о локализации имен определяют два способа передачи информации вызываемой процедуре: посредством параметров и посредством использования внешних переменных. При первом способе мы должны определить соответствующий формальный параметр процедуры, и при вызове процедуры передать нужное значение в качестве фактического параметра. При этом не требуется, чтобы вызываемая процедура была вложена в вызывающую. При втором способе в вызываемой процедуре непосредственно используется имя внешней переменной вызывающей процедуры, но при этом обязательно первая процедура должна быть вложена во вторую. Приведем пример.
8th Май 2011
|
Теги:
|