TURBO PASCAL |
Новости
|
Процедурные типы. Параметры - функции и параметры - процедуры.
Процедурные типы - это нововведение фирмы Borland (в стандартном Паскале таких типов нет). Основное назначение этих типов - дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям. Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например: type Prod = Procedure (a, b, c: Real; var d: Real); Proc2 = Procedure (var a, b) ; РгосЗ = Procedure; Func1 = Function: String; Func2 = Function (var s: String): Real; Как видно из приведенных примеров, существует два процедурных типа: тип-процедура и тип-функция. Пример 8.3 иллюстрирует механизм передачи процедур в качестве фактических параметров вызова. Программа выводит на экран таблицу двух функций: sin1(х) = (sin(x) + 1) * ехр(-х) cos1(x) = (cos(x) + 1) * exp(-x). Вычисление и печать значений этих функций реализуются в процедуре PRINTFUNC, которой в качестве параметров передаются номер позиции N на экране, куда будет выводиться очередной результат (с помощью этого параметра реализуется вывод в две колонки), и имя нужной функции. Пример 8.3. Uses CRT; type Func = Function (x: Real) : Real; {----------------} Procedure PrintFunc (XPos: Byte; F:Func) ; {Осуществляет печать функции F . (XPos - горизонтальная позиция начала вывода) } const np = 20; {Количество вычислений функций} var х : Real; i : Integer; begin {PrintFunc} for i := 1 to np do begin x := i * (2 * pi / np) ; GotoXY (XPos, WhereY) ; WriteLn (x:5:3, F(x):18:5) end end; {PrintFunc} {-----------------} Function Sin1fx: Real): Real; far; begin sinl := (sin(x) + 1) * exp(-x) end; Function Cos1(x: Real): Real; far; begin cosl := (cos(x) + 1) * exp(-x) end; {---------------} begin {основная программа} ClrScr; {Очищаем экран} PrintFunc (1, sin1); GotoXY (1,1); {Переводим курсор в левый верхний угол} PrintFunc (40, cos1) end. Обратите внимание: для установления правильных связей функций SIN1 и COS1 с процедурой PRINTFUNC они должны компилироваться с расчетом на дальнюю модель памяти. Вот почему в программу вставлены стандартные директивы FAR сразу за заголовками функций. В таком режиме должны компилироваться любые процедуры (функции), которые будут передаваться в качестве фактических параметров вызова. Стандартные процедуры (функции) Турбо Паскаля не могут передаваться рассмотренным способом. В программе могут быть объявлены переменные процедурных типов, например, так: var p1 : Proc1; f1, f2 : Func2; р : array [1..N] of Proc1; Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы, например: type Proc = Procedure (n: word; var a: Byte); var ProcVar: Proc; x, у : Byte; Procedure Procl(x: word; var y: Byte); far; begin if x > 255 then у := x mod 255 else у := Byte(x) end; begin {Главная программа} ProcVar := Proc1; for x := 150 to' 180 do begin ProcVar (x + 100, y); Write (y:8) end end. Разумеется, такого рода присваивания допустимы и для параметров-функций, например: type FuncType = Function (i : Integer) : Integer; var VarFunc : FuncType; i : Integer; Function MyFunc (count : Integer) : Integer; far; begin ....... end; {MyFunc} begin {Основная программа} ....... i := MyFunc(1); {Обычное использование результата функции} ....... VarFunc := MyFunc; {Присваивание переменной процедурного типа имени функции MyFunc} ....... end. Отметим, что присваивание VarFunc := MyFunc(1); будет недопустимым, так как слева и справа от знака присваивания используются несовместимые типы: слева - процедурный тип, а справа - INTEGER; имя функции со списком фактических параметров MyFunc(1) трактуется Турбо Паскалем как обращение к значению функции, в то время как имя функции без списка параметров рассматривается как имя функции. В отличие от стандартного Паскаля, в Турбо Паскале разрешается использовать в передаваемой процедуре (функции) любые типы параметров: параметры-значения, параметры-переменные, параметры-константы (в стандартном Паскале только параметры-значения).
|
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |