Такие параметры в списке формальных параметров предваряются ключевыми словами PROCEDURE и FUNCTION соответственно.
Пример 1. PROCEDURE P(PROCEDURE А); Здесь процедура Р имеет один параметр-процедуру А.
Пример 2.
Процедура Q имеет два параметра: параметр-функцию S и параметр-значение В.
Замечание 1. На ЕС ЭВМ имеются отличия от стандарта в описании параметров-функций (процедур). Транслятор требует перечислить все параметры функции, являющейся параметром.
Пример 3. PROCEDURE Q (FUNCTION F(I:INTEGER): REAL); Здесь формальный параметр F - функция от одного целого аргумента, результат F - вещественный.
Если вызывается процедура (функция), имеющая параметр-процедуру (функцию), то соответствующий фактический параметр должен совпадать по типу результата с формальной процедурой (функцией). Программисту необходимо внимательно следить за совпадением типов результатов, так как в случае нарушения этого правила никакой диагностики не выдается, а программа работает неверно. Поясним на примере.
Обратиться к процедуре Q(FUNCTION F(I:INTEGER):REAL) можно так: Q(SINUS(K)); где SINUS(K) есть SIN(K). Если К имеет тип INTEGER, тогда SINUS(K) - типа REAL. Это совпадает с типами I и F в заголовке Q. Нельзя, однако обратиться к Q с функцией ABS(K), а именно: Q(ABS(K)); в этом случае тип формального параметра F-REAL, а тип фактического ABS(K) - INTEGER, т. е. формальный и фактический параметры не совпадают по типу.
Задача. Составить процедуру выдачи таблицы произвольной вещественной функции. Процедура должна иметь следующие формальные параметры: вещественную функцию, нижнюю границу аргумента, верхнюю границу аргумента, шаг по аргументу.
(см. Замечание 2)
Выражение TRUNC ((UP-LOW)/STEP) дает число точек, в которых вычисляется функция F (при счете от 0).
Если к процедуре TAB обратиться оператором TAB (SIN, 0.0, 6.4, 0.33);
то будет напечатана таблица функции sin а: для а; от 0 до 6.4 с шагом 0.33. Алгоритмы, употребляемые наиболее часто различными пользователями, оформляются в виде процедур и функций, помещаются в память машины и составляют библиотеку стандартных программ (модулей).
Замечание 2. Многие трансляторы, в том числе на БЭСМ-6 и ЕС ЭВМ, не допускают использования стандартных функций в качестве фактических параметров. Для таких трансляторов оператор
TAB (SIN, 0.0, 6.4, 0.33);
является ошибочным, так как SIN(X) - стандартная функция. Это ограничение можно легко обойти, введя новую функцию, эквивалентную стандартной.
Пример. Введем функцию SINUS(X) таким образом:
Тогда составить таблицу sin x можно, обратившись к процедуре TAB следующим оператором: TAB(SINUS, 0.0, 6.4, 0.33);
При использовании параметров-процедур и параметров-функций надо иметь в виду возможные осложнения.
1. Ошибки, допускаемые программистом в процедурах, имеющих параметры-процедуры и параметры-функции, иногда бывает трудно найти, что ведет к длительной отладке таких процедур.
2. Если число и тип параметров формального параметра-функции не совпадает с числом либо типом параметров соответствующего фактического параметра-функции, то такая программа не может быть правильно выполнена, а многие версии трансляторов с паскаля не выдают в этом случае никакой диагностики,
3. Правила языка паскаль требуют, чтобы фактические параметры-процедуры (функции) содержали только параметры-значения. Это накладывает серьезные ограничения на использование параметров-процедур и параметров-функций.