Использование В в Ada

Данный ниже некоторый код в 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?

17
задан T.E.D. 9 June 2010 в 13:35
поделиться

2 ответа

Параметр в может быть прочитан, но не записан подпрограммой. в используется по умолчанию. До Ada 2012 функциям разрешалось иметь только в параметрах . Фактический параметр - это выражение.

Параметр 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;
16
ответ дан 30 November 2019 в 13:12
поделиться

В принципе, каждый параметр функции или процедуры имеет направление. Возможны следующие варианты: in, out, in out (оба) или access. Если вы не видите ни одного из этих вариантов, то по умолчанию используется in.

in означает, что данные могут поступать в подпрограмму от вызывающей стороны (через параметр). Разрешается читать из параметров in внутри подпрограммы. out означает, что данные могут выходить из подпрограммы таким образом, и, следовательно, вам разрешено присваивать значения параметру внутри подпрограммы. В целом, то, как компилятор выполняет передачу данных, зависит от него, что соответствует общей философии Ada, позволяющей указывать что вы хотите сделать, а не как вы хотите это сделать.

access - это особый случай, и он примерно такой же, как введение "*" в определение параметра в языках Cish.

Следующий вопрос, который обычно возникает у людей: "Если я передам что-то большое в качестве параметра in, будет ли он заталкивать все эти данные в стек или что-то еще?". Ответ - "нет", если только авторы вашего компилятора не являются бессовестно глупыми. Каждый известный мне компилятор Ada под капотом передает объекты большего размера, чем помещается в машинном регистре, по ссылке. Именно компилятор, а не детали вашего механизма передачи параметров, заставляет не записывать данные обратно из рутины. Опять же, вы говорите Ada, что вы хотите сделать, и она находит наиболее эффективный способ сделать это.

9
ответ дан 30 November 2019 в 13:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: