[fpc-devel] Just to confirm, "with" behaviour expected
Martin Frb
lazarus at mfriebe.de
Mon Aug 14 13:38:24 CEST 2023
In the below code, the array is resized (and more important relocated in
mem) inside the function "bar".
The commented line (without "with") works as expected.
The "with" line has a different behaviour. I guess it is by design. Just
wanted to confirm.
The version with "with" prints 12345 for " writeln(a[i,j].x);"
For all I can tell the return value of "bar" was written to the old
address of that array-entry.
Does "with" take the "address" of the value, and operate on that
address, even if the address of that value could change within the
"with" statement.
- test was performed with
fpc 3.2.3 -O1
fpc 3.3.1 -O4
program Project1;
{$mode objfpc}
procedure outer;
var
a: array of array of record x:Integer; end;
i, j: integer;
function bar(x: integer): integer;
begin
Result := random(99) + 2 * x;
writeln(Result);
SetLength(a, 3000, 200);
end;
procedure foo;
begin
i := random(99);
j := random(99);
with a[i,j] do x:= bar(x);
//a[i,j].x := bar(a[i,j].x);
end;
begin
SetLength(a, 100, 100);
for i := 0 to 99 do
for j := 0 to 99 do
a[i,j].x := 12345;
foo;
writeln(a[i,j].x);
readln;
end;
begin
outer;
end.
More information about the fpc-devel
mailing list