Процедуры и функции в качестве параметров

Такие параметры в списке формальных параметров представляются ключевыми словами procedure и function.

Примеры.

procedure p(procedure a); 

Здесь процедура p имеет один параметр-процедуру a.

procedure q(function s: real; b: real);

Процедура q имеет два параметра: параметр-функцию s и параметр-значение b.

procedure q(function f(i: integer): real);

Здесь формальный параметр f – функция от одного целого аргумента, результат f – вещественный.

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

Обратиться к процедуре q(function f(i: integer): real) можно так: q(sinus(k)); где sinus(k) есть sin(k). Если k имеет тип integer, тогда sinus(k) – типа real. Это совпадает с типами i и f в заголовке q. Нельзя, однако, обратиться к q с функцией abs(k), а именно q(abs(k)); в этом случае тип формального параметра freal, а тип фактического abs(k) – integer, т.е. формальный и фактический параметры не совпадают по типу.

Задача. Составить процедуру выдачи таблицы произвольной вещественной функции. Процедура должна иметь следующие формальные параметры: вещественную функцию, нижнюю границу документа, шаг по аргументу.

procedure tab(function f: real; low, up, step: real);
    var 
        x: real;
        j: integer;
    begin
        x := low;
        for j := 0 to trunc((up – low) / step) do begin
            writeln(x:10, f(x):10);
            x := x + step
        end
    end;

Выражение trunc((up – low) / step) дает число точек, в которых выполняется функция f (при счете от 0).

Если к функции tab обратиться оператором

tab(sin, 0.0, 6.4, 0.33);

то будет напечатана таблица функции sin x для x от 0 до 6.4 с шагом 0.33. Алгоритмы, употребляемые наиболее часто различными пользователями, оформляются в виде процедур и функций, и составляют библиотеку стандартных программ (модулей).

При использовании параметров-процедур и параметров-функций надо иметь в виду возможные осложнения.

  1. Ошибки, допускаемые программистом в процедурах, имеющих параметры-процедуры и параметры-функции, иногда бывает трудно найти, что ведет к длительной отладке таких процедур.
  2. Если число и тип параметров формального параметра-функции не совпадает с числом либо типом параметров соответствующего фактического параметра-функции, то такая программа не может быть правильно выполнена, а многие версии трансляторов с Паскаля не выдают в этом случае никакой диагностики.
  3. Правила языка Pascal требуют, чтобы фактические параметры-функции содержали только параметры-значения. Это накладывает серьезные ограничения на использование параметров-процедур и параметров-функций.

Комментарии

Здесь всё неправильно.

Нужно вначале задать процедурный тип:

type
	func = function(x:real):real;

И использовать директиву {$F+}:

{$F+}
function f1(x:real):real;
	begin
		f1 := exp(sqr(x));
	end;
{$F-}

Теперь можно использовать параметр функционального типа:

procedure integral(f:func; a,b:real; var q:real);
...
integral(f1,0.0,1.0,q1);

Подпрограмма, присваиваемая процедурной переменной, не должна быть стандартной процедурой или функцией.
Но можно написать свою подпрограмму:

function mySin(x:real):real;
	begin
		mySin := sin(x);
	end;

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
CAPTCHA на основе изображений
Введите символы, которые показаны на картинке.