Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Процедурные типы






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

Для объявления процедурного типа используют заголовок подпрограммы, в котором отсутствует имя, например:

Type proc=procedure (a, b, c: real; Var d: real);

func=function(x: real): real;

Значениями переменных процедурных типов являются идентификаторы процедур и функций с соответствующими заголовками:

Var f: func;

f: =funl;...

Процедуры или функции, идентификаторы которых будут передаваться в качестве параметров процедурного типа, по правилам языка необходимо компилировать в режиме дальнего вызова (с указанием директивы компилятора {$Р+}или служебного слова far). В этом режиме при вызове подпрограмм используются длинные 4-байтовые адреса в отличие от коротких 2-байтовых адресов, которые применяются для адресации подпрограмм, объявленных в основной программе или ее подпрограммах.

Если процедуры или функции описываются в интерфейсной части модуля, то по умолчанию они вызываются в режиме дальнего вызова, поэтому специально это оговаривать не надо.

2. Стандартные процедуры и функции, описанные в модуле System, по умолчанию являются функциями ближнего вызова. Если имена этих подпрограмм необходимо передавать через параметры, то надо описать собственную подпрограмму с указанием режима дальнего вызова, в теле которой будет находиться вызов стандартной подпрограммы, и использовать ее вместо стандартной подпрограммы.

Пример 3. Разработать подпрограмму, которая возвращает массив значений произвольной функции при заданных интервале изменения аргумента [а, b] и количестве точек n.

Имя функции будем передавать в подпрограмму через параметр процедурного типа. Массив значений будем описывать как открытый:

Unit SFun;

Interface

Typefunc=function(x: real): real;

Procedure TabFun(f: func; a, b: real; n: integer; Var Masf: array of real);

Implementation

Procedure TabFun;

Var

h, x: real;

r.integer;

Begin

h: =(b-a)/(n-l);

for i: =0 to n-1 do Masf[i]: =f(a+h*i);

End;

End.

Основная программа должна описать конкретную функцию как функцию дальнего вызова. Для функции sin создается специальная функция дальнего вызова.

Program ex;

Uses SFun;

Var

masFl: array[1.. 10] of real;

masF2: array [1.. 20] of real;

i: integer;

function Fl(x: real): real; far;

Begin

Fl: =sin(x);

end;

function F2(x: real): real; far;

Begin

F2: =exp(x)+cos(x);

end;

Begin

WriteLn(' Таблица значений функции sin x: ');

TabFun(Fl, 0, 2, 10, masFl);

for i: =l to 10 do Write(masFl[i]: 7: l);

Writeln;

WriteLn(' Таблица значений функции ехр x+cos x: ');

TabFun(F2, 0, 2, 20, masF2); for i: =l to 20 do Write(masF2[i]: 7: l);

Writeln;

End.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.