输出模式和双向输出模式之间的区别?根据我收集的信息,我知道的主要区别是,在输出模式和双向输出模式中,实际参数预计将被更改,甚至可以进行读写操作,那么主要区别是什么,请帮助我理解?
subtype Int10 is Integer range 1 .. 10;
procedure Proc (Param : in out Int10) is
begin
Param := 5;
end Proc;
Y : Integer := 100;
...
Proc (Y);
由于Param
是一个in out
参数,因此在进入时会检查其约束条件。因此,对Proc(Y)
的调用会引发Constraint_Error
异常。但是:
subtype Int10 is Integer range 1 .. 10;
procedure Proc (Param : out Int10) is
begin
Param := 5;
end Proc;
Y : Integer := 100;
...
Proc (Y);
Constraint_Error
。事实上,Y
根本不需要初始化,因为期望是过程不使用输入值。根据RM,对于某些参数类型的类,该值甚至没有被复制。因此,在这种情况下:Save_Param : Integer;
procedure Proc (Param : out Int10) is
begin
Save_Param := Param; -- legal but not recommended
Param := 5;
end Proc;
Y : Integer := 3;
...
Proc (Y);
Save_Param
可能会被设置为一些垃圾值,而不是 3
。(在 Ada 2012 中,有一个Default_Value
aspect可应用于子类型;在这种情况下,out
参数将被设为此默认值,而不是未初始化的垃圾值,而in out
参数仍会从实际参数中获得值。)in out
参数的子程序既可以读取又可以写入该参数,而带有out
参数的子程序只允许分配给该参数,但不能执行任何读取该参数值的操作(除非存在无法避免读取判别因子的情况)。因此:procedure Proc (Param : out Int10) is
begin
Param := 5;
Save_Param := Param; -- illegal in Ada 83, legal in Ada 95 and later versions
end Proc;
out
参数实际上只是输出。然而,在Ada 95中放宽了这个规则,因为程序员发现它太严格了。