Różnice między out a var - parametry metod.

0

W odniesieniu do http://docwiki.embarcadero.com/RADStudio/XE4/en/Parameters_(Delphi)#Out_Parameters.

Czy są w ogóle jakieś różnice między out a var przy podawaniu parametrów?

function X(out b: Integer): Integer;
begin
  result := b;

  b := 11;
end;

var
  a, i: Integer;

begin
  a := 3;
  i := -1;
  i := X(a);
  Writeln('a = ', a);
  Writeln('i = ', i);
  Readln;
end.

Powyższy kod daje mi kolejno takie wyniki:

  • a = 11
  • i = 3
    b na wejściu ma 3 we funkcji, spodziewałem się 0. Takie same rezultaty otrzymuję z var.

With an out parameter, however, the initial value of the referenced variable is discarded
by the routine it is passed to. The out parameter (...) doesn't provide any input.

To ja źle to pojmuję, czy out nie działa tak, jak opisują.


*Kompilacja w Embarcadero® Delphi® XE4 (Version 18.0.4905.60485) Architect (Trial).*
0

b na wejściu ma 3 we funkcji, spodziewałem się 0

Przeczytaj ponownie:

With an out parameter, however, the initial value of the referenced variable is discarded
by the routine it is passed to. The out parameter (...) doesn't provide any input.

Nigdzie tutaj nie ma informacji o jakimkolwiek zerowaniu czy przypisywaniu wartości domyślnej dla typu.

To jest imo takie undefined behavior, które akurat w tym przypadku zwraca takie wyniki, a nie inne.
FPC przykładowo daje warning, że "b" does not seem to be initialized w linijce result := b;

0

Z tego cytatu wynika, że użycie klauzuli out powinno być odwrotne do const - można modyfikować ale nie można czytać; Nie mam Delphi XE4 więc sprawdzić nie mam jak, jednak na Delphi7 nie dość, że nie ma żadnego ostrzeżenia przy kompilacji, to jeszcze kod działa całkiem prawidłowo; Ten kod:

{$APPTYPE CONSOLE}

  function Foo(out ABald: Integer): Integer;
  begin
    Result := ABald div 2;
  end;

var
  intBald: Integer = 6;
begin
  WriteLn(Foo(intBald));
  ReadLn;
end.

kompiluje się poprawnie bez ostrzeżeń czy błędów i zwraca poprawny wynik - 3; W Lazarusie jest tak samo:

{$mode objfpc}{$H+}

  function Foo(out ABald: Integer): Integer;
  begin
    Result := ABald div 2;
  end;

var
  intBald: Integer = 6;
begin
  WriteLn(Foo(intBald));
  ReadLn;
end.

z tą różnicą, że pojawia się ostrzeżenie: *

"project1.lpr(7,13) Warning: Variable "ABald" does not seem to be initialized
"

*; Dla mnie to też UB.

0

With an out parameter, however, the initial value of the referenced variable is discarded
by the routine it is passed to. The out parameter (...) doesn't provide any input.
Z tego wynika jasno: początkowa wartość parametru out jest niezdefiniowana. To wewnątrz funkcji musisz nadać jakąś wartość.

1 użytkowników online, w tym zalogowanych: 0, gości: 1