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.
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel