⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xdarray.pas

📁 我自己用的Delphi函数单元 具体说明见打包文件的HELP目录下面
💻 PAS
字号:
unit xdarray;

interface

uses SysUtils, Windows, Dialogs, Math;

//------------------------------------------------------------------//
procedure DynArrayDelete(var A; elSize: Longint; index, Count: Integer);
procedure DynArrayInsert(var A; elSize: Longint; index, Count: Integer);

//------------------------------------------------------------------//
procedure DynArrayCopy(var ADst; const ASrc; elSize: Longint; IndexDst, IndexSrc, Count: Integer);
procedure DynArrayAppend(var ADst; const ASrc; elSize: Longint; IndexSrc, Count: Integer);

implementation

//------------------------------------------------------------------//
//动态数组可用函数:
//1、设置数组大小,任意缩减或增加数组大小
//procedure SetLength(var s;NewLength:Integer);

//2、取出数组元素,复制给另一数组变量
//function Copy(S ; Index,count:Integer); array;

//3、取得数组大小及上下限
//function  Length(s):Integer;
//procedure High(x);
//procedure Low(x);

//4、具体细节置于System单元

//------------------------------------------------------------------//
//
procedure DynArraySetZero(var A);
var
  P: PLongint;
begin
  P := PLongint(A);
  Dec(P);
  P^ := 0;
  Dec(P);
  P^ := 0;
end;

//------------------------------------------------------------------//
//从索引值Index起删除Count个元素,后面的元素向前推。
// A: 动态阵列变数 elSize: 元素所占位元组 Index: 欲删除的元素索引 Count: 欲删除的元素数目
procedure DynArrayDelete(var A; elSize: Longint; index, Count: Integer);
var
  len, MaxDelete: Integer; 
  P             : PLongint;
begin
  P := PLongint(A);
  if P = nil then Exit;
  
  len := PLongint(PChar(P) - 4)^;
  
  if index >= len then Exit;
  
  MaxDelete := len - index;
  Count := Min(Count, MaxDelete);
  
  if Count = 0 then Exit; // nothing to delete
  
  Dec(len, Count);
  MoveMemory(PChar(P) + index * elSize, PChar(P) + (index + Count) * elSize, (len - index) * elSize);
  
  Dec(P);
  Dec(P);
  ReallocMem(P, len * elSize + Sizeof(Longint) * 2);
  Inc(P);
  P^ := len; // new length
  Inc(P);
  
  PLongint(A) := P;
end;

//------------------------------------------------------------------//
//在Index索引后面插入Count个数值为零的元素。
// A: 动态阵列变数 elSize: 元素所占位元组 Index: 欲插入的元素索引 Count: 欲插入的元素数目
procedure DynArrayInsert(var A; elSize: Longint; index, Count: Integer);
const
  PNull: Pointer = nil;
var
  len, I: Integer; 
  P     : PLongint;
begin
  P := PLongint(A);
  if P <> nil then
  begin
    len := PLongint(PChar(P) - 4)^;
    if (index > len) or (Count = 0) then Exit; // nothing to insert

    Dec(P);
    Dec(P);
  end else len := 0;

  ReallocMem(P, (len + Count) * elSize + Sizeof(Longint) * 2); // 先 realloc
  Inc(P);
  Dec(P);
  P^ := len + Count;
  Inc(P);

  MoveMemory(PChar(P) + (index + Count) * elSize, PChar(P) + index * elSize, (len - index) * elSize); // 往後挪
  for I := index to index + Count - 1 do
    System.Move(PNull, PChar(Integer(P) + I * elSize)^, elSize);
  
  PLongint(A) := P;
end;

//------------------------------------------------------------------//
//例子:
{
var
	A: array of char;
	I: Integer;
begin
	SetLength(A,4);
	//A=('','','','')
	for I :=0 to 3 do
		A[I] := Chr(Ord('a') + I);
	//A=('a','b','c','d')
	DynArrayDelete(A, Sizeof(Char),1,2) //删除b,c
	//A=('a','d')
	DynArrayInsert(A, Sizeof(Char),0,2) //在a后插入两个
	//A=('a','','','d')
end;
}

//------------------------------------------------------------------//
//将源ASrc的一部分元素复制到ADst上,注意只有复制,所以调用时务必要确认
//目的数组ADst大小足够来自ASrc的Count个元素。
//ADst: 目的动态数组 ASrc: 源数组 elSize: 元素所占位元组 Index:目的元素索引
//IndexSrc: 源元素索引 Count: 欲复制的元素数目
procedure DynArrayCopy(var ADst; const ASrc; elSize: Longint; IndexDst, IndexSrc, Count: Integer);
var
  PDst, PSrc    : PLongint;
  LenDst, LenSrc: Integer; 
begin
  PDst := PLongint(ADst);
  PSrc := PLongint(ASrc);
  if (PSrc = nil) then Exit;
  
  if PDst <> nil then
    LenDst := PLongint(PChar(PDst) - 4)^
     else LenDst := 0;
  
  LenSrc := PLongint(PChar(PSrc) - 4)^;
  
  Count := Min(LenSrc - IndexSrc, Count); // src array 不足时, 减少 count
  
  if IndexDst + Count - 1 > LenDst then // dst array 空间不足
  begin
    DynArrayInsert(ADst, elSize, IndexDst, (IndexDst + Count) - LenDst); // 补足, 内容不管, 待会就盖掉了
    PDst := PLongint(ADst);
  end;
  
  MoveMemory(PChar(PDst) + IndexDst * elSize, PChar(PSrc) + IndexSrc * elSize, Count * elSize); // 复制
end;

//------------------------------------------------------------------//
//将源ASrc的一部分元素追加到ADst上,自动为目的数组拉长Count个元素大小。
//ADst: 目的动态数组 ASrc: 源数组 elSize: 元素所占位元组 Index:目的元素索引
//IndexSrc: 源元素索引 Count: 欲追加的元素数目
procedure DynArrayAppend(var ADst; const ASrc; elSize: Longint; IndexSrc, Count: Integer);
var
  P: PLongint;
begin
  P := PLongint(ADst);
  if (P = nil) then Exit;
  
  DynArrayCopy(ADst, ASrc, elSize, PLongint(PChar(P) - 4)^, IndexSrc, Count);
end;
//------------------------------------------------------------------//
//例子:
{
var
	A,B: array of Integer;
	I: Integer;
begin
	SetLength(A,4);
	//A=(0,0,0,0)	
	for I:=0 to 3 do
		A[I] := I;
	//A=(0,1,2,3)
	SetLength(B,6);
	//B = (0,0,0,0,0,0);
	DynArrayCopy(B,A,Sizeof(Integer),1,0,4); 
	//B = (0,0,1,2,3,0)
	DynArrayAppend(B,A,Sizeof(Integer),0,4);
	//B = (0,0,1,2,3,0,0,1,2,3)
end;
	
}


end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -