Информатика на пять О нас
 Добавить в избранное
5byte.ru
 Теория
 8 класс
 9 класс
 10 класс
 11 класс
Задания
 8 класс
 9 класс
 10 класс
 11 класс
Книги
Тесты
ЕГЭ
Turbo Pascal 7
 Описание
 Задачи
HTML
Рефераты

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

В Turbo Pascal процедуры и функции можно рассматривать как некоторые параметры и можно использовать переменные, принимающие значение процедуры или функции. С этой целью вводятся процедурные типы, которые указывают, какой вид подпрограммы (процедуру или функцию) можно использовать в качестве параметра и с какими параметрами должны быть эти подпрограммы.

Объявление процедурного типа похоже на заголовок подпрограммы (см. п. 10): пишется слово procedure или function, за которым в круглых скобках записывается список формальных параметров; для функции после списка формальных параметров через двоеточие указывается тип функции. В отличие от заголовка подпрограммы здесь не указывается имя подпрограммы.

Пример.

type
   Proc1 = procedure;              {процедура без параметров}
   Proc2 = procedure(var X,Y: Integer);
            {процедура с двумя параметрами-переменными целого типа}
   Func1 = function(X: Real): Real;
            {функция вещественного типа с одним параметром-значением}

Далее можно ввести переменные этих типов:

var
   Р1 : Proc1;
   Р2 : Proc2;
   F1 : Func1;

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

Существует ряд правил использования подпрограмм в качестве процедурной переменной:

  • они должны компилироваться с ключом компилятора {$F+} или иметь директиву far для получения полного адреса подпрограмм;
  • они не должны быть стандартными процедурами и функциями;
  • они не должны объявляться внутри других процедур и функций;
  • они не должны быть типа inline или interrupt (пп. 10.5.5 и 10.5.6).

Пример.

{$F+}
procedure Swap (var A, B: Byte);
var
   Temp: Byte;
begin
   Temp :=A; A :=B; В := Temp
end;
function Tan(Angle: Real): Real;
begin
   Tan:=Sin(Angle) / Cos(Angle)
   {проверка, что Cos(Angle)<>0, осуществляется в основной программе}
end;
{$F-}

В этом случае процедурным переменным, введенным ранее, можно присвоить значения:

Р2 := Swap;
Fl := Tan;

а вызовы P2(I,J) и F1(X) эквивалентны соответственно Swap(I,J) и Таn(Х).

Так же как и указатель, процедурная переменная занимает 4 байта памяти, в которых помещается полный адрес подпрограммы (поэтому подпрограммы необходимо компилировать с ключом {$F+}).

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





 У Вас есть материал пишите нам
 
    Copyright © 2008    
Rambler's Top100