![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Процедурные типы
Параметры процедурного типа используют тогда, когда нужно передать в подпрограмму имена процедур и функций. Для объявления процедурного типа используют заголовок подпрограммы, в котором отсутствует имя, например: 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.
|