Помогите разобраться с процедурным типом. Изучаю Lazarus по этой книге http://www.altlinux.org/Books:FreePascal.
Непонятно зачем этот тип нужен, что он делает. Гуглил, но полученная информация особо не помогла.
Процедурный тип.
Модератор: Модераторы
Ну, если не вдаваться в детали, то процедурный тип - это тип переменной, которая должна содержать ссылку на процедуру или функцию.
Допустим, у Вас есть набор процедур (функций) по работе с чем-то, Вы выбираете из них процедуру и присваиваете переменной. Далее, когда она понадобится, эта переменная вызывается как процедура.
Например, рассмотрим "избитые" комплексные числа:
Конечно, решить эту задачу можно множеством других способов (например, делая вызов в case), но в более сложных случаях (например, когда в модуле, вызывающем переменную процедурного типа, процедура ещё не определена, и даже не должна быть определена) этот тип незаменим. Кстати, символ @ требуется только в FPC, и то в режимах fpc или objfpc.
Допустим, у Вас есть набор процедур (функций) по работе с чем-то, Вы выбираете из них процедуру и присваиваете переменной. Далее, когда она понадобится, эта переменная вызывается как процедура.
Например, рассмотрим "избитые" комплексные числа:
Код: Выделить всё
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.
Спасибо за ответ. Теперь стало понятно зачем эти типы. Вот только не понятно где они могут пригодиться, в чем их преимущество. Ведь нужную функцию можно вызвать без всяких дополнительных типов.
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Теперь стало понятно зачем эти типы. Вот только не понятно где они могут пригодиться, в чем их преимущество
В первую очередь - для контроля типов (исключения ошибок распределения памяти уже на этапе компиляции).
Alvo писал(а):Вот только не понятно где они могут пригодиться
Например в Delphi/Lazarus/MSE/..., "события" объектов - это свойства или поля процедурных типов.
Спасибо, разобрался.
