登录

Delphi数组初始化

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Stack Overflow用户 提问于2010-02-20

我目前有这个,它很糟糕:

type TpointArray = array [0..3] of Tpoint;
class function rotationTable.offsets(pType, rotState, dir: integer): TpointArray;
begin
  Result[0] := point(1, 1);
  Result[1] := point(1, 2);
  Result[2] := point(1, 1);
  Result[3] := point(1, 1);
end;

相反,我想做这样的事情:

class function rotationTable.offsets(pType, rotState, dir: integer): TpointArray;
begin
   Result := [Point(1,1), Point(1,2), Point(1,1), Point(1,1)];
end;

然而,在编译时,它抱怨1,2,3,4语法只能用于整数。

有没有一种方法可以像我想要的那样实例化/初始化一个Tpoint数组?

浏览 121 关注 0 得票数 18
  • 得票数为Stack Overflow原文数据
原文
修改于2015-03-31
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2010-02-20 12:44
得票数 25

记录数组可以在常量表达式中初始化:

const
  Points : TPointArray = ((X: 1; Y: 1), (X:1; Y:2), (X:1; Y:1), (X:1; Y:1));
class function rotationTable.offsets(pType, rotState, dir: integer): TpointArray;
begin
   Result := Points;
end;

在XE7中,可以像这样填充动态记录数组:

function GetPointArray: TArray<TPoint>;
begin
  Result := [Point(1,1),Point(1,2),Point(1,1),Point(1,1)];
end;
回答于2010-02-20
得票数 4

您不能这样做,因为您不能在代码体中表达一个点,就像在 const 部分中表达它一样。

然而,你可以做一些技巧来让你的生活变得更容易,特别是如果你有合理的点数。

您可以像这样实现一个简单的过程(代码未经过测试):

procedure BlendDimensions(aXArray, aYArray: TIntegerDynArray; var aResult: TPointArray);
  nCount: integer;
  i: integer;
begin
  nCount:=High(aXArray);
  if nCount <> High(aYArray) then 
    Exception.Create('The two dimension arrays must have the same number of elements!');
  SetLength(aResult, nCount);
  for i:=0 to nCount do
  begin
    aResult[i].X:=aXArray[i]; //simple copy
    aResult[i].y:=aYArray[i];
end;

RTL TIntegerDynArray是...where的动态整数数组。(事实上,它适用于任何动态数组)。此外,上面示例中的TPointArray也是动态的。

所以,为了完成你的工作,你可以这样做:

procedure Foo;
  myXCoords, myYCoords: TIntegerDynArray; //temp arrays
  myPoints: TPointArray; //this is the real thing
begin
  myXCoords:=TIntegerDynArray.Create( 1, 2, 3, 4, 5, 6, 7, 8, 9,10);
  myYCoords:=TIntegerDynArray.Create(21,32,34,44,55,66,65,77,88,92); //...for example 
  BlendDimensions(myXCoords, myYCoords, myPoints); //build the real thing
 //use it...
end;

注意事项:

  • 你可以清楚地看到哪些是你的要点
  • ,你可以通过这种方式
  • 你也可以在其他事情上使用 BlendDimensions ,不仅仅是这个
  • 你可以很容易地将 BlendDimensions 扩展为3个(或更多) dimensions
  • ...but,请注意,因为涉及到副本。:-)在今天的PC中,到目前为止,弱点将是您的手。:-)你会累得打字更快,直到复印时间被注意到为止。

HTH

修改于2017-05-23
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2010-02-20 23:25
得票数 10

Plainth's answer 演示了 动态数组 的类似构造函数的语法。您可以直接在TPoint数组上使用它来生成一个简单得多的助手函数:

type
  TPointDynArray = array of TPoint;
  T4PointArray = array[0..3] of TPoint;
function PointDynArrayTo4PointArray(const input: TPointDynArray): T4PointArray;
  i: Integer;
begin
  Assert(Length(input) = Length(Result));
  for i := 0 to High(input) do
    Result[i] := input[i];
class function rotationTable.offsets(pType, rotState, dir: integer): T4PointArray;
begin
  // New dynamic-array-constructor syntax here
  Result := PointDynArrayTo4PointArray(TPointDynArray.Create(
    Point(1,1), Point(1,2), Point(1,1), Point(1,1)));
end;

但这太夸张了。Delphi还允许您内联定义 开放数组 ,并且不需要编写额外的构造函数调用。结果使用您最初提出的语法,但将数组包装在函数调用中。它可以在所有的Delphi版本中工作,而上面的"Create“语法是相当新的。

function PointOpenArrayTo4PointArray(const input: array of TPoint): T4PointArray;
  i: Integer;
begin
  Assert(Length(input) = Length(Result));
  for i := 0 to High(input) do
    Result[i] := input[i];