[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