Использование IN OUT в Аде
Ниже приведен некоторый код в ada
with TYPE_VECT_B; use TYPE_VECT_B;
Package TEST01 is
procedure TEST01
( In_State : IN VECT_B ;
Out_State : IN OUT VECT_B );
function TEST02
( In_State : IN VECT_B ) return Boolean ;
end TEST01;
Спецификация и тело пакета TYPE_VECT_B также определены ниже
Package TYPE_VECT_B is
type VECT_B is array (INTEGER range <>) OF BOOLEAN ;
rounded_data : float ;
count : integer ;
trace : integer ;
end TYPE_VECT_B;
Package BODY TYPE_VECT_B is
begin
null;
end TYPE_VECT_B;
Что означает переменная In_State и Out_State? Я думаю, что In_State означает входную переменную. Я просто запутался в том, что на самом деле означает Out_State?
Ответы
Ответ 1
Параметр in
может быть прочитан, но не написан подпрограммой. in
- значение по умолчанию. До Ada 2012 функции могли иметь только параметры in
. Фактический параметр является выражением.
Параметр out
означает, что предыдущее значение не представляет интереса. Ожидается, что подпрограмма будет записываться в параметр. После записи в параметр подпрограмма может прочитать, что она написала. При выходе фактический параметр получает записанное на него значение (в этой области есть сложности!). Фактический параметр должен быть переменной.
Параметр in out
похож на параметр out
, за исключением того, что предыдущее значение представляет интерес и может быть прочитано подпрограммой перед назначением. Например,
procedure Add (V : Integer; To : in out Integer; Limited_To : Integer)
is
begin
-- Check that the result wont be too large. This involves reading
-- the initial value of the 'in out' parameter To, which would be
-- wrong if To was a mere 'out' parameter (it would be
-- uninitialized).
if To + V > Limited_To then
To := Limited_To;
else
To := To + V;
end if;
end Add;
Ответ 2
В принципе, каждый параметр функции или процедуры имеет направление к ней. Возможные значения: in
, out
, in out
(оба) или access
. Если вы не видите один из них, по умолчанию он равен in
.
in
означает, что данные могут поступать в подпрограмму от вызывающего (через параметр). Вы можете читать параметры in
внутри процедуры. out
означает, что данные могут выйти из подпрограммы таким образом, и поэтому вам разрешено присваивать значения параметру внутри подпрограммы. В общем, как компилятор выполняет передачу данных, зависит от компилятора, что соответствует общей философии Ada, позволяющей вам указать, что вы хотите сделать, а не как это сделать.
access
является частным случаем и примерно похож на "*" в определении параметра в языках Cish.
Следующий вопрос, который обычно возникает у людей: "Если я передам что-то большое как параметр in
, он собирается вытолкнуть все эти данные в стек или что-то в этом роде?" Ответ "нет", если только ваши авторы-компиляторы не могут быть глупыми. Каждый компилятор Ada, который я знаю под капотом, пропускает объекты, которые больше, чем подходят в машинном регистре по ссылке. Это компилятор, а не детали вашего параметра, передающего механизм, который принуждает не записывать данные обратно из подпрограммы. Опять же, вы говорите Аде, что вы хотите сделать, она определяет наиболее эффективный способ сделать это.