[fpc-devel] Maybe room for better documentation? open array as var param
Martin Frb
lazarus at mfriebe.de
Thu Jul 20 18:41:44 CEST 2023
For const param, it is well documented that the value (that includes the
variable that is passed) must not be changed.
But for "var param"?
Well maybe, but not explicit
https://www.freepascal.org/docs-html/ref/refsu68.html#x184-20800014.4.5
>> Open parameters can be passed by value, by reference or as a
constant parameter. In the latter cases the procedure receives a pointer
to the actual array.
So a user with sufficient experience could detect that if a pointer is
received, then the value which is pointed to must not be changed.
Maybe that should be mentioned more explicitly.
And maybe it should additionally also be mentioned on
https://www.freepascal.org/docs-html/ref/refsu65.html
Because the below may be unexpected to quite a few users.
It will (at least on my test on windows / of course depends on mem
manager) print numbers starting at 300.
Even so 200++ has been assigned.
But (with sufficient luck or lack of luck) "y" will re-use the memory of
"x". And "a" will then change "y" which may not be expected.
program Project1;
{$mode objfpc}
var x,y: array of integer;
i: Integer;
procedure foo(var a: array of integer);
var
j: Integer;
begin
x := nil;
SetLength(y, 10);
for j := 0 to 9 do y[j] := 200+j;
for j := 0 to 9 do a[j] := 300+j;
end;
begin
SetLength(x, 10);
for i := 0 to 9 do x[i] := 100+i;
foo(x);
for i := 0 to 9 do writeln(y[i]);
readln;
end.
More information about the fpc-devel
mailing list