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是默认值。在 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;
于 2010-06-09T08:14:51.853 回答
10

基本上,函数或过程的每个参数都有一个方向。选项为inoutin out(两者)或access。如果您没有看到其中之一,则默认为in.

in意味着数据可以从调用者(通过参数)进入子程序。您可以从in例程内的参数中读取。out意味着数据可以以这种方式从例程中出来,因此您可以将值分配给例程内的参数。一般来说,编译器如何完成数据传递取决于编译器,这符合 Ada 的一般理念,即允许您指定您想要做什么,而不是您希望如何完成

access是一种特殊情况,大致类似于在 Cish 语言中的参数定义中添加“*”。

人们通常会问的下一个问题是“如果我传递一些大的参数作为in参数,它是否会将所有数据推送到堆栈或其他东西上?” 答案是“不”,除非您的编译器编写者非常愚蠢。我知道的每个 Ada 编译器都通过引用传递大于机器寄存器容量的对象。是编译器,而不是参数传递机制的细节,强制不将数据写回例程。再一次,你告诉 Ada 你想做什么,它会找出最有效的方法。

于 2010-06-09T13:23:54.323 回答