Страница 1 из 1

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

СообщениеДобавлено: 24.04.2011 11:34:43
Alvo
Помогите разобраться с процедурным типом. Изучаю Lazarus по этой книге http://www.altlinux.org/Books:FreePascal.
Непонятно зачем этот тип нужен, что он делает. Гуглил, но полученная информация особо не помогла.

Re: Процедурный тип.

СообщениеДобавлено: 24.04.2011 12:37:11
daesher
Ну, если не вдаваться в детали, то процедурный тип - это тип переменной, которая должна содержать ссылку на процедуру или функцию.
Допустим, у Вас есть набор процедур (функций) по работе с чем-то, Вы выбираете из них процедуру и присваиваете переменной. Далее, когда она понадобится, эта переменная вызывается как процедура.
Например, рассмотрим "избитые" комплексные числа:
Код: Выделить всё
program compltest;

{$mode objfpc}{$H+}

type
  TComplex=record
    Re,Im:real;
  end;
  TComplexOperation=function(C1,C2:TComplex):TComplex;

Function CplPlus(C1,C2:TComplex):TComplex;
begin
   Result.Re:=C1.Re+C2.Re;
   Result.Im:=C1.Im+C2.Im;
end;


Function CplMinus(C1,C2:TComplex):TComplex;
begin
   Result.Re:=C1.Re-C2.Re;
   Result.Im:=C1.Im-C2.Im;
end;

Function CplNull(C1,C2:TComplex):TComplex;
begin
   Result.Re:=0;
   Result.Im:=0;
end;


var
   C1,C2,C3:TComplex;
   Op:TComplexOperation;
   OpStr:String;
begin
  Write('Введите с1.Re ');Readln(c1.Re);
  Write('Введите с1.Im ');Readln(c1.Im);
  Write('Введите с2.Re ');Readln(c2.Re);
  Write('Введите с2.Im ');Readln(c2.Im);
  Write('Введите символ операции');Readln(OpStr);
  if length(OpStr)<1 then halt;
  case OpStr[1] of
  '+':Op:=@CplPlus;
  '-':Op:=@CplMinus;
  else Op:=@CplNull;
  end;
  C3:=Op(C1,C2);
  Writeln('C3.Re=',C3.Re,' C3.Im=',c3.Im);
end.     


Конечно, решить эту задачу можно множеством других способов (например, делая вызов в case), но в более сложных случаях (например, когда в модуле, вызывающем переменную процедурного типа, процедура ещё не определена, и даже не должна быть определена) этот тип незаменим. Кстати, символ @ требуется только в FPC, и то в режимах fpc или objfpc.

Re: Процедурный тип.

СообщениеДобавлено: 26.04.2011 04:36:04
Alvo
Спасибо за ответ. Теперь стало понятно зачем эти типы. Вот только не понятно где они могут пригодиться, в чем их преимущество. Ведь нужную функцию можно вызвать без всяких дополнительных типов.

Re: Процедурный тип.

СообщениеДобавлено: 26.04.2011 08:14:40
debi12345
Теперь стало понятно зачем эти типы. Вот только не понятно где они могут пригодиться, в чем их преимущество

В первую очередь - для контроля типов (исключения ошибок распределения памяти уже на этапе компиляции).

Re: Процедурный тип.

СообщениеДобавлено: 26.04.2011 09:02:53
v-t-l
Alvo писал(а):Вот только не понятно где они могут пригодиться

Например в Delphi/Lazarus/MSE/..., "события" объектов - это свойства или поля процедурных типов.

Re: Процедурный тип.

СообщениеДобавлено: 27.04.2011 19:02:13
Alvo
Спасибо, разобрался.