Delphi中的数组追加 [英] array append in delphi

查看:15
本文介绍了Delphi中的数组追加的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正尝试在Delphi 7中实现数组追加,因为标准库没有它。这就是我到目前为止所拥有的,但当我尝试获取数组的长度时,它会报告不兼容的类型。

procedure ArrayAppend(var GenericArray; const Element);
var
  len: Integer;
begin
  len := Length(GenericArray);
  SetLength(GenericArray, len+1);
  GenericArray[len] := Element;
end;

我正在尝试找出Delphi 7中最通用的数组类型。

如果这是唯一的方法,我也可以返回修改后的数组。

推荐答案

为了说明Rob Kennedy在注释中所说的内容,这里有一个将向动态数组追加一个值的函数。但是,这是一个相当残缺的函数,因为它不支持托管类型。因此,不能有字符串、接口、变量或动态数组。或者实际上包含任何托管类型的复合结构。

{$APPTYPE CONSOLE}

uses
  SysUtils,
  TypInfo;

type
  PDynArrayTypeInfo = ^TDynArrayTypeInfo;
  TDynArrayTypeInfo = packed record
    kind: Byte;
    name: Byte;
    elSize: Longint;
    elType: ^PDynArrayTypeInfo;
    varType: Integer;
  end;

function DynArraySize(a: Pointer): Integer;
asm
        TEST EAX, EAX
        JZ   @@exit
        MOV  EAX, [EAX-4]
@@exit:
end;

type
  TIntegerArray = array of Integer;

procedure AppendUnmanaged(var arr{: TArray<T>}; const Value{: T}; TypeInfo: PTypeInfo);
var
  len, elSize: Integer;
begin
  len := DynArraySize(Pointer(arr)) + 1;
  DynArraySetLength(Pointer(arr), TypeInfo, 1, @len);
  inc(PAnsiChar(TypeInfo), PDynArrayTypeInfo(TypeInfo).name);
  elSize := PDynArrayTypeInfo(TypeInfo).elSize;
  Move(Value, (PAnsiChar(Pointer(arr)) + (len-1)*elSize)^, elSize);
end;

procedure Main;
var
  arr: TIntegerArray;
  i, Value: Integer;
begin
  Value := -1;
  AppendUnmanaged(arr, Value, TypeInfo(TIntegerArray));

  Value := 666;
  AppendUnmanaged(arr, Value, TypeInfo(TIntegerArray));

  Value := 42;
  AppendUnmanaged(arr, Value, TypeInfo(TIntegerArray));

  for i := low(arr) to high(arr) do
    Writeln(arr[i]);
end;

begin
  try
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

与现代Delphi相比,您可以看到一些明显的问题,Delphi在语言中嵌入了泛型类型和数组连接。具体来说,我在考虑以下问题:

  1. 您必须为该函数提供类型信息。
  2. 无法传递文字,因为它们作为非类型化参数无效。

现在,当然可以复制编译器在分配托管类型时所做的事情。但这真的值得吗?上面的代码,特别是调用代码,真的是对类型安全替代方案的改进吗?我个人不这么认为。

这篇关于Delphi中的数组追加的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆