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

Reply via email to