以下是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的含义感到困惑?
答案 0 :(得分:15)
可以读取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;
答案 1 :(得分:8)
基本上,函数或过程的每个参数都有一个方向。选项包括in
,out
,in out
(两者)或access
。如果您没有看到其中一个,则默认为in
。
in
表示数据可以从调用者进入子例程(通过参数)。您可以从例程中的in
参数中读取。 out
表示数据可以通过该方式从例程中出来,因此您可以为例程内的参数赋值。通常,编译器如何完成数据传递取决于编译器,这符合Ada允许您指定您想要完成的内容的一般原则,而不是您希望如何完成。
access
是一个特例,大致就像在Cish语言的参数定义中加上“*”。
人们通常会遇到的下一个问题是“如果我将一些大的东西作为in
参数传递,是否会将所有数据推送到堆栈上?”答案是“不”,除非你的编译器编写者是不合情理的愚蠢。我所知道的每个Ada编译器都会通过引用传递大于适合机器寄存器的对象。它是编译器,而不是参数传递mechanisim的细节,它强制不将数据写回例程。再一次,你告诉Ada你想要做什么,它找出了最有效的方法。