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

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

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

Сообщение Alvo » 24.04.2011 11:34:43

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

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

Сообщение daesher » 24.04.2011 12:37:11

Ну, если не вдаваться в детали, то процедурный тип - это тип переменной, которая должна содержать ссылку на процедуру или функцию.
Допустим, у Вас есть набор процедур (функций) по работе с чем-то, Вы выбираете из них процедуру и присваиваете переменной. Далее, когда она понадобится, эта переменная вызывается как процедура.
Например, рассмотрим "избитые" комплексные числа:
Код: Выделить всё
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.
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

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

Сообщение Alvo » 26.04.2011 04:36:04

Спасибо за ответ. Теперь стало понятно зачем эти типы. Вот только не понятно где они могут пригодиться, в чем их преимущество. Ведь нужную функцию можно вызвать без всяких дополнительных типов.
Alvo
незнакомец
 
Сообщения: 8
Зарегистрирован: 24.04.2011 11:21:02

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

Сообщение debi12345 » 26.04.2011 08:14:40

Теперь стало понятно зачем эти типы. Вот только не понятно где они могут пригодиться, в чем их преимущество

В первую очередь - для контроля типов (исключения ошибок распределения памяти уже на этапе компиляции).
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение v-t-l » 26.04.2011 09:02:53

Alvo писал(а):Вот только не понятно где они могут пригодиться

Например в Delphi/Lazarus/MSE/..., "события" объектов - это свойства или поля процедурных типов.
v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение Alvo » 27.04.2011 19:02:13

Спасибо, разобрался.
Alvo
незнакомец
 
Сообщения: 8
Зарегистрирован: 24.04.2011 11:21:02


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25

Рейтинг@Mail.ru