[fpc-devel] Feature request/discussion - SetLengthNoInit

Ryan Joseph genericptr at gmail.com
Thu Sep 17 06:16:27 CEST 2020


Here's an example of the main problem that keeps us from using custom types to replace dynamic arrays. We basically a need [] property modifier that treats records the same way the dynamic array syntax does. GetValue could be a procedure and use a var parameter and maybe even that would be enough. I don't know what the solutions could be but if the compiler team actually agreed to approve anything I would be happy to personally implement this myself.

============================

{$mode objfpc}
{$modeswitch autoderef}
{$modeswitch advancedrecords}

program dyanmic_array;

type
  TMyRec = record
    x, y: byte;
  end;

type
  generic TArray<T> = record
    private type
      PT = ^T;
    private
      data: array[0..1] of T;
      function GetValue(index: integer): PT; inline;
      procedure SetValue(index: integer; const value: PT); inline;
    public
      property Values[index: integer]: PT read GetValue write SetValue; default;
  end;
  TMyRecArray = specialize TArray<TMyRec>;

function TArray.GetValue(index: integer): PT;
begin
  result := @data[index];
end;

procedure TArray.SetValue(index: integer; const value: PT);
begin
  data[index] := value^;
end;

var
  r: TMyRec;
  a: TMyRecArray;
begin
  r.x := 1;
  r.y := 2;

  // WRONG: we need to use pointers to write to the array
  a[0] := @r;

  // CORRECT: we return pointers to the record so we can write to the underlying data (autoderef must be enabled)
  a[0].x := 100;

  // CORRET: same as above but with member access and autoderef
  writeln('x: ', a[0].x);

  // WRONG: to copy the record out of the array we need to derefence the pointer
  r := a[0]^;
  writeln('r.x: ', r.x);
end.

Regards,
	Ryan Joseph



More information about the fpc-devel mailing list