Ada 输出模式和输入输出模式之间的主要区别是什么?

Ada 输出模式和输入输出模式之间的主要区别是什么?,ada,mode,Ada,Mode,输出模式和输入输出模式之间的区别?据我收集的信息是 我所知道的主要区别是,在out和in out模式下,实际参数预计都会改变,甚至可以进行写入和读取。那么,主要区别是什么请帮助我理解?对差异的最好解释是RM 6.4.1(11-15) 从语义上讲,只有通过copy传递的参数不同。如果调用具有in-out参数的子程序,则实际参数在调用前应具有合法值。输入时,子程序复制变量并进行检查以确保其满足约束 对于out参数,实际参数不需要输入值;它可能是未初始化的垃圾。其目的是,在子程序设置该参数之前,子程序

输出模式和输入输出模式之间的区别?据我收集的信息是
我所知道的主要区别是,在out和in out模式下,实际参数预计都会改变,甚至可以进行写入和读取。那么,主要区别是什么请帮助我理解?

对差异的最好解释是RM 6.4.1(11-15)

从语义上讲,只有通过copy传递的参数不同。如果调用具有
in-out
参数的子程序,则实际参数在调用前应具有合法值。输入时,子程序复制变量并进行检查以确保其满足约束

对于
out
参数,实际参数不需要输入值;它可能是未初始化的垃圾。其目的是,在子程序设置该参数之前,子程序不会使用该参数的值(可以通过赋值或作为
out
参数传递给其他子程序,或传递给
默认值
,或通过其他方式进行设置)。然而,这并不强制执行

在某些情况下,这可能会导致不同的行为。例如:

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\u错误
。然而:

subtype Int10 is Integer range 1 .. 10;

procedure Proc (Param : out Int10) is 
begin
    Param := 5;
end Proc;

Y : Integer := 100;
...
Proc (Y);
在这种情况下,不会引发任何约束错误。实际上,
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_值
方面;在这种情况下,
out
参数将被设置为该默认值,而不是未初始化的垃圾,而
In-out
参数仍将从实际参数获取值。)

对于通过引用传递的参数,其行为实际上没有区别

Ada 83中的规则是不同的。带有
in-out
参数的子程序可以读取和写入该参数,而带有
out
参数的子程序可以分配给该参数,但不能执行任何读取该参数值的操作(除非某些情况下无法读取鉴别器)。因此:


换句话说,
out
参数实际上只是
out
put。不过,Ada 95放宽了这一规则,因为程序员发现它限制太多。

可能重复的请不要将其作为重复关闭;有一些差异未被相关问题涵盖。我正在努力寻找答案。
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;