Использование IN OUT в Аде - PullRequest
16 голосов
/ 09 июня 2010

Ниже приведен код в 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?

Ответы [ 2 ]

15 голосов
/ 09 июня 2010

Параметр in может быть прочитан, но не записан подпрограммой.in по умолчанию.До Ады 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;
8 голосов
/ 09 июня 2010

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

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

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

Следующий вопрос, который обычно задают люди: «если я передам что-то большое как *Параметр 1018 *, он собирает все эти данные в стек или что-то в этом роде? "Ответ - «нет», если ваши авторы компиляторов не глупы.Каждый известный мне компилятор Ada пропускает объекты большего размера, чем помещается в регистр машины по ссылке.Это компилятор, а не детали вашего механизма передачи параметров, который принудительно не записывает данные обратно из процедуры.Опять же, вы говорите Аде, что вы хотите сделать, она находит наиболее эффективный способ сделать это.

...