【问题标题】:Does Free Pascal have a way to concatenate arrays?Free Pascal 有连接数组的方法吗?
【发布时间】:2011-12-09 20:18:41
【问题描述】:

Pascal 显然有字符串连接,但它对任何类型的数组都有通用连接吗?

【问题讨论】:

  • 没有。请注意,您最近的大部分问题都可以在手册中找到。
  • 我不知道在手册中的何处搜索此类问题的答案。如果存在一般连接,那么谷歌“free pascal concatenate”很容易。
  • 试试语言参考中的数组章节。
  • 哪个手册,有好几本。啊,Language Reference Guide。部分:Arrays。该文档没有列出连接方法,仅列出了一个复制方法,如果 fpc stable 具有 Delphi 泛型,理论上可以用于编写自定义连接函数。

标签: arrays concatenation freepascal


【解决方案1】:

这个怎么样?如果您需要在很多地方连接,+ 运算符看起来很不错恕我直言。

  program ConCatTest;

  type
  SomeRec = record
      s: AnsiString;
      i: Longint;
  end;
  SomeArr = array of SomeRec;

    operator + (a, b: SomeArr) c: SomeArr;
    var
  i: Longint;
    begin
  SetLength(c, Length(a) + Length(b));
  for i := 0 to High(a) do
      c[i] := a[i];
  for i := 0 to High(b) do
      c[i + Length(a)] := b[i];
    end;

    var
  a1, a2, a3: SomeArr;
  i: Longint;
    begin
  SetLength(a1, 3);
  SetLength(a2, 2);
  a1[0].s := 'a';
  a1[0].i := 0;
  a1[1].s := 'a';
  a1[1].i := 1;
  a1[2].s := 'a';
  a1[2].i := 2;
  a2[0].s := 'b';
  a2[0].i := 0;
  a2[1].s := 'b';
  a2[1].i := 1;

  a3 := a1 + a2;

  for i := 0 to High(a3) do
      WriteLn(a3[i].s, a3[i].i);
  ReadLn;
  end.

【讨论】:

  • 这适用于任何类型的数组,还是仅适用于SomeRec?我正在寻找一种通用方法来连接两个相同类型的数组。
  • 它是 SomeRec 特有的,但要将它用于任何其他记录/数组类型,您需要做的就是复制并通过粘贴另一种类型来更改运算符声明的第一行。如果我可以一次对所有类型的数组执行此操作,我会更喜欢,但这是我能得到的最接近的。
  • 谢谢,但我对将类型 A 连接在一起的函数不感兴趣。我对一种通用方法感兴趣,可以将任何两个相同元素类型的数组连接在一起,而无需更改代码。
  • 我明白这一点,我也希望如此。我的解决方案尽可能接近 AFAIK,这是一个简单的运算符定义,您可以通过两次粘贴类型来在一秒钟内适应另一个运算符定义。这不是比上面的 ConcArray 函数更好的解决方案吗?
【解决方案2】:

它没有,但你可以制作自己的函数,我在 5 分钟内编写了这个代码......我确信有更好的方法,但我现在不知道。

type
 TBArray = array of byte;  

function ConcArray(arr1,arr2:TBArray):TBArray;
begin
    SetLength(Result,Length(arr1) + Length(arr2));
    ZeroMemory(@Result[0],Length(arr1) + Length(arr2));
    CopyMemory(@Result[0],@arr1[0],Length(arr1));
    CopyMemory(@Result[Length(arr1)],@arr2[0],Length(arr2));
end; 

【讨论】:

  • 这适用于字节,但是如何为任意类型(整数、短裤、字节数组数组等)编写 ConcArray?
  • 没有通用的方法。
猜你喜欢
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
相关资源
最近更新 更多