Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
|
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); | + | < |
| - | | + | MODULE FunctionalCalculator; |
| - | sl.String(' | + | |
| - | END Test1; | + | |
| - | PROCEDURE Test2 (IN str: ARRAY OF CHAR); | + | IMPORT Out := StdLog; |
| - | BEGIN | + | |
| - | sl.String(' | + | |
| - | END Test2; | + | |
| - | | + | TYPE |
| - | VAR | + | CalculatorLong = PROCEDURE |
| - | pp: tP; | + | CalculatorBool = PROCEDURE (VAR acc: BOOLEAN; a, b: INTEGER); |
| - | str: ARRAY 40 OF CHAR; | + | |
| - | BEGIN | + | PROCEDURE Add(VAR acc: LONGINT; cur: INTEGER); |
| - | | + | BEGIN acc := acc + cur END Add; |
| - | | + | |
| - | pp(str); | + | PROCEDURE Sub(VAR acc: LONGINT; cur: INTEGER); |
| - | | + | BEGIN acc := acc - cur END Sub; |
| - | | + | |
| - | 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): | ||
| + | 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): | ||
| + | VAR | ||
| + | i: INTEGER; | ||
| + | acc: BOOLEAN; | ||
| + | BEGIN | ||
| + | acc := TRUE; i := 1; | ||
| + | REPEAT | ||
| + | | ||
| + | INC(i); | ||
| + | UNTIL (i = LEN(nums)) OR ~acc; | ||
| + | RETURN acc; | ||
| + | END ReduceBool; | ||
| + | |||
| + | PROCEDURE Start*; | ||
| + | VAR | ||
| + | sn: ARRAY 5 OF INTEGER; (* sn - some nums *) | ||
| + | orderedNums: | ||
| + | sum, mul: LONGINT; | ||
| + | greater, less: BOOLEAN; | ||
| + | BEGIN | ||
| + | | ||
| + | |||
| + | sum := ReduceLong(sn, Add); | ||
| + | Out.String('sum = '); Out.Int(sum); | ||
| + | |||
| + | mul := ReduceLong(sn, Mul); | ||
| + | | ||
| + | |||
| + | orderedNums[0] | ||
| + | | ||
| + | orderedNums[2] := 1; | ||
| + | |||
| + | greater := ReduceBool(orderedNums, Greater); | ||
| + | Out.String('greater = '); Out.Bool(greater); | ||
| + | |||
| + | less := ReduceBool(orderedNums, | ||
| + | Out.String(' | ||
| + | END Start; | ||
| + | |||
| + | END FunctionalCalculator. | ||
| </ | </ | ||
| + | |||
| ==== Важные замечания ==== | ==== Важные замечания ==== | ||
| + | |||
| Если переменной процедурного типа не присвоить значение, | Если переменной процедурного типа не присвоить значение, | ||