初始化一个固定数组的动态数组常量?

Rob*_*ank 8 delphi

我可以初始化一个恒定的动态数组吗?

如果:

type
  tNamePair = array[1..2] of String;
  tPairList = array of tNamePair;
Run Code Online (Sandbox Code Playgroud)

如何创建初始化常量?我无法得到以下代码编译:

const
  PairList: tPairList = ( ('One', '1'), 
                          ('Two', '2'),
                          ('Three', '3'));
Run Code Online (Sandbox Code Playgroud)

如果那是不可能的,可以用固定数组初始化一个固定的固定数组:

 type
    tPairList: array[1..3] of tNamePair;
Run Code Online (Sandbox Code Playgroud)

如果这不可能,可以使用记录初始化常量动态数组:

tNamePair = record 
              English: String;
              Number: String;
            end;           
tPairList = array of tNamePair;
Run Code Online (Sandbox Code Playgroud)

如果不可能,可以使用记录初始化常量固定数组:

tNamePair = record 
              English: String;
              Number: String;
            end;           
tPairList = array[1..3] of tNamePair;
Run Code Online (Sandbox Code Playgroud)

如果这是不可能的,除了代码中的硬连线分配之外的任何建议,坦率地说,这比我撰写这个问题花费的时间少!

Rem*_*eau 25

在XE7之前,您无法创建动态数组常量.必须在编译时知道常量,但在运行时分配动态数组.

固定的阵列固定阵列可以在编译时被声明:

type
  tNamePair = array[1..2] of String;
  tPairList = array[1..3] of tNamePair;

const
  PairList: tPairList = ( ('One', '1'),
                          ('Two', '2'),
                          ('Three', '3'));
Run Code Online (Sandbox Code Playgroud)

固定的阵列记录也可以在编译时宣称:

type
  tNamePair = record
              English: String;
              Number: String;
            end;
  tPairList = array[1..3] of tNamePair;

const
  PairList: tPairList = ( (English: 'One'; Number: '1'),
                          (English: 'Two'; Number: '2'),
                          (English: 'Three'; Number: '3'));
Run Code Online (Sandbox Code Playgroud)

如果需要动态数组,则必须在运行时构造它.您可以直接构建它:

type
  tNamePair = array[1..2] of String;
  tPairList = array of tNamePair;

var
  PairList: tPairList;

initialization
  SetLength(PairList, 3);
  PairList[0][1] := 'One';
  PairList[0][2] := '1';
  PairList[1][1] := 'Two';
  PairList[1][2] := '2';
  PairList[2][1] := 'Three';
  PairList[2][2] := '3';
end.
Run Code Online (Sandbox Code Playgroud)

或者,您可以定义编译时常量固定数组,并在运行时将其复制到动态数组中:

type
  tNamePair = array[1..2] of String;
  tPairList = array[1..3] of tNamePair;
  tPairListDyn = array of tNamePair;

const
  PairList: tPairList = ( ('One', '1'),
                          ('Two', '2'),
                          ('Three', '3'));

function MakePairListDyn(const Pairs: tPairList): tPairListDyn;
var
  I, J: Integer;
begin
  SetLength(Result, Length(Pairs));
  for I := Low(Pairs) to High(Pairs) do begin
    Result[J] := Pairs[I];
    Inc(J);
  end;
end;

var
  Pairs: tPairListDyn;

initialization
  Pairs := MakePairListDyn(PairList);
end.
Run Code Online (Sandbox Code Playgroud)

对于XE7后的情况,请参阅下面的@LURD答案.

  • 感谢提醒我有点不寻常的声明const数组记录的语法,我会立刻再次忘记;-) (4认同)

LU *_* RD 11

在XE7中,可以声明动态数组常量.

简单案例:

const
  a: TArray<String> = ['Delphi','XE7'];
Run Code Online (Sandbox Code Playgroud)

在您的示例中,这将编译:

type
  tNamePair = TArray<String>;
  tPairList = TArray<tNamePair>;

const
  PairList: tPairList = [['One', '1'],['Two', '2'],['Three', '3']];
Run Code Online (Sandbox Code Playgroud)

要创建记录的动态数组,可以在运行时完成,如下所示:

Type
  TNamePair = record
    English: String;
    Number: String;
    class function Define(_English,_Number: String): TNamePair; static;
  end;
  TPairList = TArray<TNamePair>;

class function TNamePair.Define(_English, _Number: String): TNamePair;
begin
  Result.English := _English;
  Result.Number := _Number;
end;

var
  pl : TPairList;
begin
  pl := [TNamePair.Define('A','1'),TNamePair.Define('B','2')];
  ...
end;
Run Code Online (Sandbox Code Playgroud)