Следующая версия
|
Предыдущая версия
|
bb:redbook:209 [2016/03/31 15:27] prospero78 создано |
bb:redbook:209 [2019/07/23 16:12] caufman [4. Атрибут OUT] |
| |
Пример использования: | Пример использования: |
| MODULE TestTest_in; |
| IMPORT Log, Math; |
| |
| PROCEDURE Do(IN a:INTEGER); |
| VAR |
| BEGIN |
| Log.Int(a);Log.Ln; |
| a:=3; |
| Log.Int(a);Log.Ln; |
| END Do; |
| |
| BEGIN |
| END TestTest_in. |
Как видно из примера, при попытке его скомпилировать, посыпятся сообщения об ошибках. И всё именно потому, что параметр с атрибутом IN доступен только для чтения. К тому же, параметр "а" определён как INTEGER, а допустимые типы — записи или массивы. [↑] | Как видно из примера, при попытке его скомпилировать, посыпятся сообщения об ошибках. И всё именно потому, что параметр с атрибутом IN доступен только для чтения. К тому же, параметр "а" определён как INTEGER, а допустимые типы — записи или массивы. [↑] |
| |
| |
Пример ниже показывает как работать с такими параметрами: | Пример ниже показывает как работать с такими параметрами: |
| MODULE TestTest_out; |
| IMPORT Log, Math; |
| |
| PROCEDURE Do(OUT z:INTEGER; r:REAL); |
| VAR |
| BEGIN |
| z:=5; |
| r:=-1; |
| END Do; |
| |
| PROCEDURE Start*; |
| VAR |
| BEGIN |
| Do(0,0) |
| END; |
| |
| BEGIN |
| END TestTest_out. |
Как видно из примера, попытка скомпилировать модуль, с вызовом пройцедуры Do закончилась крахом, так как, в качестве аргументов передаются константы, а не переменные. По возврате из процедуры, чему присваивать возвращаемые значения? В примере, представленном ниже, все ошибки устранены и модуль успешно компилируется: | Как видно из примера, попытка скомпилировать модуль, с вызовом пройцедуры Do закончилась крахом, так как, в качестве аргументов передаются константы, а не переменные. По возврате из процедуры, чему присваивать возвращаемые значения? В примере, представленном ниже, все ошибки устранены и модуль успешно компилируется: |
| MODULE TestTest_out; |
| IMPORT StdLog, Math; |
| |
| PROCEDURE Do (OUT z: INTEGER; r: REAL); |
| VAR |
| BEGIN |
| z := 5; |
| r := - 1; |
| END Do; |
| |
| PROCEDURE Start*; |
| VAR |
| z1: INTEGER; |
| r1: REAL; |
| BEGIN |
| Do(z1, r1); |
| StdLog.Int(z1); StdLog.Ln; |
| StdLog.Real(r1); StdLog.Ln; |
| END Start; |
| |
| BEGIN |
| END TestTest_out. |
| |
| (!)TestTest_out.Start |
Оператор RETURN мог бы возвращать несколько значений, во многих языках программирования такой функционал реализован. Но лучше оператор RETURN рассматривать как оператор управления потоком, с возможностью возврата кода выполнения операции, а не штатную возможность возвращать результат операций. Также стоит отметить, что возврат результата требует больше накладных расходов, чем непосредственное изменение переменной. | Оператор RETURN мог бы возвращать несколько значений, во многих языках программирования такой функционал реализован. Но лучше оператор RETURN рассматривать как оператор управления потоком, с возможностью возврата кода выполнения операции, а не штатную возможность возвращать результат операций. Также стоит отметить, что возврат результата требует больше накладных расходов, чем непосредственное изменение переменной. |
| |