В заголовке подпрограммы указываются формальные параметры. При вызове подпрограммы указываются фактические параметры.
Корректность передачи параметров основывается на их порядке перечисления в заголовке подпрограммы и совместимости по присваиванию между соответствующими фактическими и формальными параметрами. Сфера действия имен параметров такая же, как и локальных данных.
Список формальных параметров необязателен и может отсутствовать.
В списке перечисляются имена формальных параметров и их типы, например: Procedure SB(a: Real; b: Integer; c: Char);
Function F(a, b: Real): Real;
Механизм замены формальных параметров на фактические позволяет нужным образом настроить алгоритм, реализованный в подпрограмме.
Любой из формальных параметров подпрограммы может быть либо параметром-значением, либо параметром-переменной, либо параметром-константой.
Если параметры определяются как параметры-переменные, то перед ними необходимо ставить зарезервированное слов Var, а если это параметры-константы – слово Const. Например,
В выделяемые ячейки памяти формального параметра передается копия
Формальный параметр
фактического и обратно не возвращается.
Параметры-переменные
Фактический параметр
Передается адрес (не значение!) фактического параметра.
По имеющемуся адресу изменяется содержимое ячеек памяти фактического параметра, т.е. выполняется возврат результата.
Формальный параметр
Параметры-константы
Фактический параметр
Передается адрес фактического параметра.
По имеющемуся адресу разрешено только брать значение фактического параметра, а изменять его значение запрещено, т.е. обратного влияния нет.
Формальный параметр
Пример использования различных типов параметров. В программе задаются два целых числа 5 и 7, эти числа передаются процедуре Inc2, в которой они удваиваются. Один из параметров передается как параметр-переменная, другой – как параметр-значение. Значения параметров до и после вызова процедуры, а также результат их удвоения выводятся на экран.
Const a: Integer = 5;
b: Integer = 7;
Procedure Inc2(Var c: Integer; b: Integer);
Begin
c := 2*c; b := 2*b;
Writeln(‘Удвоенные ’, c: 5, b: 5);
End;
Begin
Writeln(‘Исходные ’, a: 5, b: 5);
Inc2(a, b);
Writeln(‘Результат ’, a: 5, b: 5);
Readln;
End.
В результате прогона программы будет выведено:
Исходные 5 7
Удвоенные 10 14
Результат 10 7
Определение формального параметра тем или иным способом существенно только для вызывающей программы: если формальный параметр объявлен как параметр-переменная, то при вызове подпрограммы ему должен соответствовать фактический параметр в виде переменной нужного типа; если формальный параметр объявлен как параметр-значение, то при вызове ему может соответствовать произвольное выражение. Контроль осуществляется компилятором Турбо Паскаля.
C помощью параметров-переменных подпрограмма может передавать результаты своей работы вызывающей программе. Другой способ передачи результатов – через глобальные переменные. Однако злоупотребление глобальными связями делает программу, как правило, запутанной, трудной в понимании и сложной в отладке.
Чем меньше параметров объявлено параметрами-переменными и чем меньше в подпрограмме используется глобальных переменных, тем меньше опасность получения непредусмотренных программистом побочных эффектов, связанных с вызовом подпрограммы, тем проще программа в понимании и отладке.
Не рекомендуется использовать параметры-переменные в заголовке функции: если результатом работы функции не может быть единственное значение, то логичнее использовать процедуру.
Параметры-константы целесообразно использовать в случаях, если требуется передавать структуры данных, занимающие большой размер памяти, но изменять исходные значения параметров с алгоритмической точки зрения недопустимо. В результате экономно используется оперативная память и одновременно гарантируется целостность исходных данных.