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

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


cp:obx-proc-type

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
cp:obx-proc-type [2021/06/24 14:58]
iadenisov
cp:obx-proc-type [2024/08/28 10:41] (текущий)
theathlete [Пример]
Строка 1: Строка 1:
-===== Использование процедурных типов =====+====== Использование процедурных типов ======
  
 Суть этой возможности в **Компонентном Паскале** состоит в том, что можно создать //переменную//, которой позже можно присвоить //адрес// какой-либо //процедуры//, после чего, можно использовать эту переменную как саму процедуру. Суть этой возможности в **Компонентном Паскале** состоит в том, что можно создать //переменную//, которой позже можно присвоить //адрес// какой-либо //процедуры//, после чего, можно использовать эту переменную как саму процедуру.
Строка 8: Строка 8:
  
 <code> <code>
-MODULE TestProcedure;+MODULE FunctionalCalculator;
  
-    IMPORT sl := StdLog;+IMPORT Out := StdLog;
  
-    TYPE +TYPE 
-        tP = PROCEDURE (IN strARRAY OF CHAR);+  CalculatorLong = PROCEDURE (VAR accLONGINT; cur: INTEGER); 
 +  CalculatorBool = PROCEDURE (VAR acc: BOOLEAN; a, b: INTEGER);
  
-    PROCEDURE Test1 (IN strARRAY OF CHAR); +PROCEDURE Add(VAR accLONGINT; cur: INTEGER); 
-    BEGIN +BEGIN acc := acc cur END Add;
-        sl.String('Test1:=str); sl.Ln +
-    END Test1;+
  
-    PROCEDURE Test2 (IN strARRAY OF CHAR); +PROCEDURE Sub(VAR accLONGINT; cur: INTEGER); 
-    BEGIN +BEGIN acc := acc - cur END Sub;
-        sl.String('Test2:=' + str); sl.Ln +
-    END Test2;+
  
-    PROCEDURE Start*; +PROCEDURE Mul(VAR accLONGINTcurINTEGER)
-    VAR +BEGIN acc := acc * cur END Mul;
-        pptP; +
-        strARRAY 40 OF CHAR+
-    BEGIN +
-        pp := Test1; +
-        str := 'Привет, Вася!'; +
-        pp(str); +
-        pp := Test2; +
-        str := 'Привет, Петя!'; +
-        pp(str) +
-    END Start;+
  
-END TestProcedure.+PROCEDURE Div(VAR acc: LONGINT; cur: INTEGER); 
 +BEGIN acc := acc DIV cur END Div; 
 + 
 +PROCEDURE Greater(VAR acc: BOOLEAN; a, b: INTEGER); 
 +BEGIN acc := acc & (a > b) END Greater; 
 + 
 +PROCEDURE Less(VAR acc: BOOLEAN; a, b: INTEGER); 
 +BEGIN acc := acc & (a < b) END Less; 
 + 
 +PROCEDURE ReduceLong(IN nums: ARRAY OF INTEGER; c: CalculatorLong): LONGINT; 
 +VAR 
 +  i: INTEGER; 
 +  acc: LONGINT; 
 +BEGIN 
 +  acc := nums[0]; 
 +  FOR i := 1 TO LEN(nums) - 1 DO c(acc, nums[i]) END; 
 +  RETURN acc; 
 +END ReduceLong; 
 + 
 +PROCEDURE ReduceBool(IN nums: ARRAY OF INTEGER; c: CalculatorBool): BOOLEAN; 
 +VAR 
 +  i: INTEGER; 
 +  acc: BOOLEAN; 
 +BEGIN 
 +  acc := TRUE; i := 1; 
 +  REPEAT 
 +    c(acc, nums[i-1], nums[i]); 
 +    INC(i); 
 +  UNTIL (i = LEN(nums)) OR ~acc; 
 +  RETURN acc; 
 +END ReduceBool; 
 + 
 +PROCEDURE Start*; 
 +VAR 
 +  sn: ARRAY 5 OF INTEGER; (* sn - some nums *) 
 +  orderedNums: ARRAY 3 OF INTEGER; 
 +  sum, mul: LONGINT; 
 +  greater, less: BOOLEAN; 
 +BEGIN 
 +  sn[0] := 1; sn[1] := 3; sn[2] := 5; sn[3] := 7; sn[4] := 9; 
 + 
 +  sum := ReduceLong(sn, Add); 
 +  Out.String('sum = '); Out.Int(sum); Out.Ln; 
 + 
 +  mul := ReduceLong(sn, Mul); 
 +  Out.String('mul = '); Out.Int(mul); Out.Ln; 
 + 
 +  orderedNums[0] := 7; 
 +  orderedNums[1] := 5; 
 +  orderedNums[2] := 1; 
 + 
 +  greater := ReduceBool(orderedNums, Greater); 
 +  Out.String('greater = '); Out.Bool(greater); Out.Ln; 
 + 
 +  less := ReduceBool(orderedNums, Less); 
 +  Out.String('less = '); Out.Bool(less); Out.Ln; 
 +END Start; 
 + 
 +END FunctionalCalculator.
 </code> </code>
  
cp/obx-proc-type.1624535903.txt.gz · Последнее изменение: 2021/06/24 14:58 — iadenisov