Содержание
Список параметров
В заголовке подпрограммы (в её объявлении) указывается список формальных параметров переменных, которые принимают значения, передаваемые в подпрограмму извне во время её вызова. Для краткости мы далее будем опускать слово «формальный».
Поскольку внутри подпрограммы параметры рассматриваются как переменные с начальным значением, то имена локальных переменных, описываемые в разделе var (внутреннем для подпрограммы), не могут совпадать с именами параметров этой же подпрограммы. Подробнее о локальных и глобальных переменных мы расскажем в пункте «Разграничение контекстов».
Список параметров может и вовсе отсутствовать:
function func1: boolean;
В этом случае подпрограмма не получает никаких переменных «извне». Упомянутый в начале лекции песенный припев как раз и является примером подпрограммы, в которую не передаётся никаких данных при вызове.
Однако отсутствие параметров и, как следствие, передаваемых извне значений вовсе не означает, что при каждом вызове подпрограмма будет выполнять абсолютно одинаковые действия. Поскольку глобальные переменные видны изнутри любой подпрограммы, их значения могут неявно изменять внутреннее состояние подпрограмм. Этому очень нежелательному эффекту будет посвящён пункт «Побочный эффект».
Если же параметры имеются, то каждый из них описывается по следующему шаблону:
[<способ_подстановки>]<имя_параметра>:<тип>;
О возможных способах подстановки значений в параметры (<пустой>, var, const) мы расскажем в разделе «Способы подстановки аргументов».
Если способ подстановки и тип нескольких параметров совпадают, описание этих параметров можно объединить:
[<способ_подстановки>]<имя1>,...,<имяN>: <тип>;
Пример описания всех трёх способов подстановки:
В заголовке подпрограммы можно указывать только простые (не составные) типы данных. Следовательно, попытка записать
вызовет ошибку уже на этапе компиляции. Для того, чтобы обойти это ограничение, составной тип данных нужно описать в разделе type, а при объявлении подпрограммы воспользоваться именем этого типа:
procedure proc2(a : arr);
function func2(var x : String) : arr;
Возвращаемые значения
Основное различие между функциями и процедурами состоит в количестве возвращаемых ими значений.
Любая функция, завершив свою работу, должна вернуть основной программе (или другой вызвавшей её подпрограмме) ровно одно значение, причём, его тип нужно явным образом указать уже при объявлении функции.
Для возвращения результата применяется специальная «переменная», имеющая имя, совпадающее с именем самой функции. Оператор присваивания значения этой «переменной» обязательно должен встречаться в теле функции хотя бы один раз.
Например:
begin
if a > b then
min := b
else
min := a
end;
В отличие от функций, процедуры вообще не возвращают (явным образом) никаких значений. О том, как всё–таки получить результаты работы процедуры, вы узнаете из пункта «Параметр–переменная».
Вызов подпрограмм
Любая подпрограмма может быть вызвана не только из основного тела программы, но и из любой другой подпрограммы, объявленной позже неё.
При вызове в подпрограмму передаются фактические параметры или аргументы (в круглых скобках после имени подпрограммы, разделённые запятыми):
<имя_подпрограммы>(<список_аргументов>)
Аргументами могут быть переменные, константы и выражения, включающие в себя вызовы функций.
Количество и типы передаваемых в подпрограмму аргументов должны соответствовать количеству и типам её параметров. Кроме того, тип каждого аргумента должен обязательно учитывать способ подстановки, указанный для соответствующего параметра (подробнее об этом будет рассказано в разделе «Способы подстановки аргументов»). Если у подпрограммы вообще нет объявленных параметров, то при вызове список передаваемых аргументов будет отсутствовать вместе с обрамляющими его скобками.
Вызов функции не может быть самостоятельным оператором, потому что возвращаемое значение нужно куда–то записывать. Зато оно может стать равноправным участником арифметического выражения. Например:
if min(z, min(x, y)) = 0 then {...};
Процедура же ничего не возвращает явным образом, поэтому её вызов является отдельным оператором в программе. Например:
Замечание: После того, как вызванная подпрограмма завершит свою работу, управление передается оператору, следующему за оператором, вызвавшим эту подпрограмму.
Способы подстановки аргументов
Как уже упоминалось выше, при вызове подпрограммы подстановка значений аргументов в параметры производится в соответствии с правилами, указанными в атрибуте <способ_подстановки>. Мы рассмотрим три различных значения этого атрибута:
- <пустой>;
- var;
- const1.
Примечания
- ^ Существует лишь в поздних версиях языка Pascal.