【问题标题】:Importing a 2d array into a class with delphi [duplicate]使用delphi将二维数组导入类[重复]
【发布时间】:2020-10-19 08:14:54
【问题描述】:

我正在尝试在 create 方法中创建一个带有 2d 数组(arrscore)的类,我对此进行了一些研究,目前为止。

constructor create(spriority, sSelOne, sSeltwo, sSelthree: string; arrcountry: array of string; arrscore: array of real);

这是我的类变量声明

type
  tMap = class
  private
    // variables
    priority, selone, seltwo, selthree: string;
    country: array of string;
    score: array of real;

这是我的创建代码

 begin
  priority := spriority;
  selone := sSelOne;
  seltwo := sSeltwo;
  selthree := sSelthree;
  country := arrcountry;
  score := arrscore;
end;

这不起作用,因为它是动态数组和实数数组的不兼容类型。 提前致谢。

【问题讨论】:

  • 我没有看到任何二维数组。我只看到两个一维数组。
  • 不要按值传递打开的数组。如果你这样做了,那么就会制作一个副本并在堆栈上传递。这是低效的并且可能导致堆栈溢出。使用const 参数。然后您需要做的是用分配新数组的代码(使用SetLength)替换对动态数组的分配,然后在循环中将参数中的值复制到动态数组。在现代 Delphi 中,您可以使用 System.Generics.Collections.TArray.Copy 代替循环

标签: arrays class delphi multidimensional-array


【解决方案1】:

是的,这很烦人。

如果您使用open array parameters,传统上您必须以手动且繁琐的方式复制数组:

var
  country: array of string; // dynamic array
  score: array of Real; // dynamic array

// open array parameters
constructor Create(...; const arrcountry: array of string; const arrscore: array of Real);
var
  i: Integer;
begin
  SetLength(country, Length(arrcountry));
  for i := 0 to High(arrcountry) do
    country[i] := arrcountry[i];
  // similarly for score/arrscore
end;

然而,正如David Heffernan 指出的那样,最近的 Delphi 版本也提供了TArray.Copy<T> 过程:

SetLength(country, Length(arrcountry));
TArray.Copy<string>(arrcountry, country, Length(arrcountry));
SetLength(score, Length(arrscore));
TArray.Copy<Real>(arrscore, score, Length(arrscore));

但如果你改用dynamic array参数,你可以这样做

var
  country: TArray<string>; // dynamic array
  score: TArray<Real>; // dynamic array

// dynamic array parameters
constructor Create(...; arrcountry: TArray<string>; arrscore: TArray<Real>);
begin
  country := arrcountry;
  score := arrscore;
end;

请注意,数组不会被复制,因此您对country 所做的任何更改都会影响调用方的数组(因为它是同一个数组)。

如果你想复制,做

country := Copy(arrcountry);
score := Copy(arrscore);

【讨论】:

  • “你必须手动复制数组,而且很繁琐”在现代 Delphi 中并非如此。查看我对 Q 的评论
  • @DavidHeffernan:感谢您指出TArray.Copy&lt;T&gt; 程序。我完全忘记了那个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2017-09-07
  • 2016-02-04
  • 1970-01-01
  • 2018-03-20
  • 2010-11-29
相关资源
最近更新 更多