Инструменты пользователя

Инструменты сайта


cp:obx-proc-type

Это старая версия документа!


Использование процедурных типов

Суть этой возможности в Компонентном Паскале состоит в том, что можно создать переменную, которой позже можно присвоить адрес какой-либо процедуры, после чего, можно использовать эту переменную как саму процедуру.

При этом, нужно помнить, что список аргументов у переменной процедурного типа и самой процедуры должны совпадать.

Пример

MODULE FunctionalCalculator;

IMPORT Out := StdLog;

TYPE
  Calculator = PROCEDURE (a, b: LONGINT): LONGINT;
  CalculatorBoolean = PROCEDURE (a, b: LONGINT): BOOLEAN;

PROCEDURE Add(a, b: LONGINT): LONGINT;
BEGIN RETURN a + b END Add;

PROCEDURE Sub(a, b: LONGINT): LONGINT;
BEGIN RETURN a - b END Sub;

PROCEDURE Mul(a, b: LONGINT): LONGINT;
BEGIN RETURN a * b END Mul;

PROCEDURE Div(a, b: LONGINT): LONGINT;
BEGIN RETURN a DIV b END Div;

PROCEDURE Greater(a, b: LONGINT): BOOLEAN;
BEGIN RETURN a > b END Greater;

PROCEDURE Less(a, b: LONGINT): BOOLEAN;
BEGIN RETURN a < b END Less;

PROCEDURE ReduceLongint(nums: ARRAY OF LONGINT; c: Calculator): LONGINT;
VAR
  i, res: LONGINT;
BEGIN
  res := nums[0];
  FOR i := 1 TO LEN(nums) - 1 DO
    res := c(res, nums[i]);
  END;
  RETURN res;
END ReduceLongint;

PROCEDURE ReduceBoolean(nums: ARRAY OF LONGINT; c: CalculatorBoolean): BOOLEAN;
VAR
  i: LONGINT;
  res: BOOLEAN;
BEGIN
  res := TRUE;
  FOR i := 1 TO LEN(nums) - 1 DO
    res := res & c(nums[i-1], nums[i]); 
  END;
  RETURN res;
END ReduceBoolean;

PROCEDURE Start*;
VAR
  sn: ARRAY 5 OF LONGINT; (* sn - some nums *)
  orderedNums: ARRAY 3 OF LONGINT;
  sum, mul: LONGINT;
  greater, less: BOOLEAN;
  
BEGIN
  sn[0] := 1; sn[1] := 3; sn[2] := 5; sn[3] := 7; sn[4] := 9;
  sum := ReduceLongint(sn, Add);
  Out.String('sum = '); Out.Int(sum); Out.Ln;

  mul := ReduceLongint(sn, Mul);
  Out.String('mul = '); Out.Int(mul); Out.Ln;

  orderedNums[0] := 7;
  orderedNums[1] := 5;
  orderedNums[2] := 1;
  greater := ReduceBoolean(orderedNums, Greater);
  Out.String('greater = '); Out.Bool(greater); Out.Ln;

  less := ReduceBoolean(orderedNums, Less);
  Out.String('less = '); Out.Bool(less); Out.Ln;
END Start;

END FunctionalCalculator.

Важные замечания

Если переменной процедурного типа не присвоить значение, она будет иметь значение NIL.

cp/obx-proc-type.1723660855.txt.gz · Последнее изменение: 2024/08/14 21:40 — theathlete