Also als erstes einmal darfst du nicht den selben Wert den du als const parameter übergibst als var oder out parameter übergeben.
Wenn du einen Wert an einen const parameter übergibst versprichst du das der Wert konstant bleibt während dem Funktionsaufruf. Wenn du einen Wert als var oder out übergibst versprichst du das er geändert werden bzw. Ersetzt werden kann. Aber der Wert kann nicht gleichzeitig konstant bleiben und verändert werden. Das führt dann zu solchen Sachen:
Code: Alles auswählen
type
TMyRec = record
A: Integer;
end;
procedure Foo(const r: TMyRec; var A: Integer);
begin
A:=42;
WriteLn(r.A);
end;
var
r: TMyRec;
begin
r.A:=32;
Foo(r, r.A);
end.
Das WriteLn gibt auf 32 und 64 Bit Systemen was unterschiedliches aus, einmal 32 und einmal 42.
Wozu untypisiertes out gut ist, im Grunde das selbe wie untypisiertes var nur das es eben ein out parameter ist
Code: Alles auswählen
procedure Move2(const Src; out Dst; Size: SizeInt);
var i: SizeInt;
begin
for i:=0 to Size-1 do
PByte(@Dst)[i] := PByte(@Src)[i]
end;
Als etwas ineffiziente alternative zur System Move Funktion.
Grundsätzlich sind out parameter wie var Parameter mit 2 unterschieden, zum einen ist nicht garantiert das der vorige wert bestehen bleibt (also wenn du einen string als out parameter übergibst wird der vor dem Funktionsaufruf gecleared), zum anderen gilt das als setzen des Wertes und man erhält keine Warnung:
Code: Alles auswählen
var
i,j,k: Integer;
begin
i:=42;
Move(i,j); // Warnung j nicht initialisiert weil var Parameter
Move2(i,k); // keine Warnung weil out parameter