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;