复制动态数组

好久不见. 提交于 2020-01-31 19:17:10
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TArr = array of Int64; {先把需要的动态数组数组定义成一个类型, 因为下面需要类型转换}
var
  arr1,arr2: TArr;       {两个等待测试的数组变量}
  p: Pointer;            {该指针用于中转数组中的数据}

{先给第一个数组赋测试值}
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to 1000 - 1 do
  begin
    SetLength(arr1, Length(arr1)+1);
    arr1[High(arr1)] := i * 2;
  end;
  {抽查显示}
  ShowMessage(IntToStr(arr1[9])); {18}
end;

{复制到第二个数组}
procedure TForm1.Button1Click(Sender: TObject);
var
  size: Cardinal;
begin
  size := Length(arr1) * SizeOf(arr1[0]); {源数组大小}
  GetMem(p, size);                        {根据源数组大小分配内存}
  CopyMemory(p, arr1, size);              {复制}
  arr2 := TArr(p);                        {转换}
  {抽查显示}
  ShowMessage(IntToStr(arr2[9]));         {18}
end;

end.


假定数组元素是个结构, 再测试一次:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TRec = record
    str: string;
    int: Integer;
  end;

  TArr = array of TRec;

var
  arr1,arr2: TArr;
  p: Pointer;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to 1000 - 1 do
  begin
    SetLength(arr1, Length(arr1)+1);
    arr1[High(arr1)].str := IntToStr(i);
    arr1[High(arr1)].int := i * 2;
  end;
  ShowMessageFmt('%s,%d',[arr1[9].str, arr1[9].int]); {9,18}
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  size: Cardinal;
begin
  size := Length(arr1) * SizeOf(arr1[0]);
  GetMem(p, size);
  CopyMemory(p, arr1, size);
  arr2 := TArr(p);
  ShowMessageFmt('%s,%d',[arr2[9].str, arr2[9].int]); {9,18}
end;

end.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!