20

以下は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 が実際に何を意味するのか混乱しますか?

4

2 に答える 2

22

inパラメータは、サブプログラムによって読み取ることはできますが、書き込むことはできません。inがデフォルトです。inAda 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;
于 2010-06-09T08:14:51.853 に答える
10

基本的に、関数またはプロシージャへのすべてのパラメータには方向があります。オプションは、、、in(両方)、またはoutです。これらのいずれも表示されない場合は、デフォルトで になります。in outaccessin

inデータが呼び出し元から (パラメーターを介して) サブルーチンに入ることができることを意味します。inルーチン内のパラメーターから読み取ることができます。outは、データがそのようにルーチンから出てくることができることを意味し、したがって、ルーチン内のパラメーターに値を割り当てることができます。一般に、コンパイラがデータの受け渡しを行う方法はコンパイラ次第であり、これは、実行方法ではなく、実行内容を指定できるという Ada の一般的な哲学と一致しています

accessこれは特殊なケースであり、Cish 言語のパラメーター定義に "*" を入れるのとほぼ同じです。

人々が通常抱く次の質問は、「何か大きなものをinパラメーターとして渡すと、そのすべてのデータがスタックまたは何かにプッシュされるのでしょうか?」というものです。答えは「いいえ」です。ただし、コンパイラの作成者が不当に愚かでない限りはそうです。私が知っているすべての Ada コンパイラは、参照によってマシン レジスタに収まらないサイズのオブジェクトを渡します。ルーチンからデータを書き戻さないようにするのは、パラメーターを渡すメカニズムの詳細ではなく、コンパイラーです。繰り返しますが、あなたがやりたいことを Ada に伝えると、Ada はそれを行う最も効率的な方法を見つけ出します。

于 2010-06-09T13:23:54.323 に答える