9

配列の定数動的配列を初期化できますか?

もしも:

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

初期化された定数を作成するにはどうすればよいですか? 以下のコードをコンパイルできません。

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

それが不可能な場合は、定数固定配列を固定配列で初期化できますか?

 type
    tPairList: array[1..3] of tNamePair;

それが不可能な場合は、定数の動的配列をレコードで初期化できますか:

tNamePair = record 
              English: String;
              Number: String;
            end;           
tPairList = array of tNamePair;

それが不可能な場合は、定数固定配列をレコードで初期化できます:

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

それが不可能な場合は、率直に言って、この質問を作成するよりも時間がかからなかったであろう、コードに割り当てを配線する以外の提案があれば!

4

3 に答える 3

27

XE7 より前は、動的配列定数を作成できませんでした。定数はコンパイル時に認識される必要がありますが、動的配列は実行時に割り当てられます。

固定配列の固定配列は、コンパイル時に宣言できます。

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

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

コンパイル時にレコード固定配列を宣言することもできます。

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'));

動的配列が必要な場合は、実行時に構築する必要があります。直接ビルドすることもできます:

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.

または、コンパイル時の定数固定配列を定義し、実行時に動的配列にコピーすることもできます。

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));
  J := 0;
  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.

XE7 後の状況については、@LURD の回答を参照してください。

于 2012-05-10T00:49:06.413 に答える
14

XE7 では、動的配列定数を宣言できます。

単純なケース:

const
  a: TArray<String> = ['Delphi','XE7'];

あなたの例では、これはコンパイルされます:

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

const
  PairList: tPairList = [['One', '1'],['Two', '2'],['Three', '3']];

レコードの動的配列を作成するには、次のように実行時に実行できます。

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;
于 2014-09-02T11:51:07.507 に答える