在Ada中使用IN OUT

mad*_*ddy 17 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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

变量In_State和Out_State实际上意味着什么?我认为In_State表示输入变量.我只是对Out_State的含义感到困惑?

Sim*_*ght 16

一个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;
Run Code Online (Sandbox Code Playgroud)

  • 作为FYI的Juast:Ada的下一版本Ada 2012将不再将函数参数限制为in和access,即函数也将被允许具有out和out参数.http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai05s/ai05-0143-1.txt?rev=1.3 (2认同)

T.E*_*.D. 9

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

in表示数据可以从调用者进入子程序(通过参数).您可以从in例程中的参数读取.out表示数据可以通过该方式从例程中出来,因此您可以为例程内的参数赋值.通常,编译器如何完成数据传递取决于编译器,这符合Ada的一般原则,即允许您指定要执行的操作,而不是您希望如何完成.

access 是一个特例,大致就像在Cish语言的参数定义中加上"*".

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