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

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


cp:obx-proc-type

Различия

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

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

Следующая версия
Предыдущая версия
cp:obx-proc-type [2017/12/27 08:20]
иван_денисов создано
cp:obx-proc-type [2024/08/28 10:41] (текущий)
theathlete [Пример]
Строка 1: Строка 1:
-===== Использование процедурных типов =====+====== Использование процедурных типов =====
 Суть этой возможности в **Компонентном Паскале** состоит в том, что можно создать //переменную//, которой позже можно присвоить //адрес// какой-либо //процедуры//, после чего, можно использовать эту переменную как саму процедуру. Суть этой возможности в **Компонентном Паскале** состоит в том, что можно создать //переменную//, которой позже можно присвоить //адрес// какой-либо //процедуры//, после чего, можно использовать эту переменную как саму процедуру.
  
Строка 5: Строка 6:
  
 ==== Пример ==== ==== Пример ====
-<code oberon2> 
-MODULE TestProcedure; 
-    IMPORT sl := StdLog; 
-    TYPE 
-        tP = PROCEDURE (IN str: ARRAY OF CHAR); 
  
-    PROCEDURE Test1 (IN str: ARRAY OF CHAR); +<code> 
-    BEGIN +MODULE FunctionalCalculator;
-        sl.String('Test1:=' + str); sl.Ln +
-    END Test1;+
  
-    PROCEDURE Test2 (IN str: ARRAY OF CHAR); +IMPORT Out := StdLog;
-    BEGIN +
-        sl.String('Test2:=' + str); sl.Ln +
-    END Test2;+
  
-    PROCEDURE Start*; +TYPE 
-    VAR +  CalculatorLong = PROCEDURE (VAR acc: LONGINT; cur: INTEGER); 
-        pptP+  CalculatorBool = PROCEDURE (VAR acc: BOOLEAN; a, b: INTEGER); 
-        str: ARRAY 40 OF CHAR+ 
-    BEGIN +PROCEDURE Add(VAR acc: LONGINT; cur: INTEGER); 
-        pp := Test1+BEGIN acc := acc + cur END Add; 
-        str := 'ПриветВася!'; + 
-        pp(str); +PROCEDURE Sub(VAR acc: LONGINT; cur: INTEGER); 
-        pp := Test2+BEGIN acc := acc - cur END Sub; 
-        str := 'ПриветПетя!'; + 
-        pp(str+PROCEDURE Mul(VAR acc: LONGINT; cur: INTEGER); 
-    END Start; +BEGIN acc := acc cur END Mul
-END TestProcedure. + 
-TestProcedure.Start+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(snAdd); 
 +  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(orderedNumsGreater); 
 +  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>
 +
 ==== Важные замечания ==== ==== Важные замечания ====
 +
 Если переменной процедурного типа не присвоить значение, она будет иметь значение **NIL**. Если переменной процедурного типа не присвоить значение, она будет иметь значение **NIL**.
  
cp/obx-proc-type.1514352017.txt.gz · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)