Я новичок в Ada.Ada out параметр
Я видел этот question, но мой немного отличается:
type A is record
x : integer;
y : integer;
end record;
procedure P1 is
temp : A;
begin
temp.x := 100;
P2(temp);
if temp.x = 100 then
Ada.Text_IO.Put_Line("true");
else
Ada.Text_IO.Put_Line("false");
end if;
end One;
procedure P2 (arg1 : out A) is
begin
arg1.y := 200;
end P2;
Мой вопрос с «из» параметра P2: будут другие части составного типа неопределен, если P2 не явно установите их. Другими словами, если вызывается P1, будет ли вывод определенно истинным или ложным? Или, может быть, двусмысленный?
Этот link говорит о «инициализации по умолчанию», но мой пример выше не имеет его явно (специально).
Safety is preserved by ensuring that a subcomponent does not become
"deinitialized" by being passed as an out parameter. If any subcomponent
of a type passed by copy has default initialization, then the whole
object is copied in at the start of the call so that the value of such a
subcomponent is not lost as a result of a subprogram call during which
no assignment is made to the subcomponent. But in practice records are
usually passed by reference anyway.
Я не уверен, является ли это специфичным для компилятора поведение? Будет ли компилятор, который мог бы пройти по копии, будет вести себя так же?Я постараюсь не рисковать! –
Спасибо @trashgod. Если он зависит от компилятора, то использует «in out» единственный верный способ убедиться, что он работает (если вы не уверены, что прошедшая запись имеет инициализацию по умолчанию): 'procedure P2 (arg1: in out A) is ' ' begin' 'arg1.y: = 200;' 'end P2;' –
@TNguyen: Я разработал выше. – trashgod