假设我有动态数组
type TCharArr = Array of byte;
type PcharArr = ^TCharArr;
var charArr: PcharArr;
我想用New(charArr);在堆中分配内存;
但是,如何指定大小和索引?动态数组是否可以具有索引,例如。从512 ..到1024?
答案 0 :(得分:6)
假设使用的是Delphi的最新版本,则可以使用通用记录来模仿它:
type
TDynArray<T> = record
private
FData: TArray<T>;
FOffset: Integer;
function GetData(Index: Integer): T;
function GetHigh: Integer;
function GetLength: Integer;
function GetLow: Integer;
procedure SetData(Index: Integer; const Value: T);
public
constructor Create(ALow, AHigh: Integer);
property Data[Index: Integer]: T read GetData write SetData; default;
property High: Integer read GetHigh;
property Length: Integer read GetLength;
property Low: Integer read GetLow;
end;
constructor TDynArray<T>.Create(ALow, AHigh: Integer);
begin
FOffset := ALow;
SetLength(FData, AHigh - ALow + 1);
end;
function TDynArray<T>.GetData(Index: Integer): T;
begin
Result := FData[Index - FOffset];
end;
function TDynArray<T>.GetHigh: Integer;
begin
Result := FOffset + System.High(FData);
end;
function TDynArray<T>.GetLength: Integer;
begin
Result := System.Length(FData);
end;
function TDynArray<T>.GetLow: Integer;
begin
Result := FOffset;
end;
procedure TDynArray<T>.SetData(Index: Integer; const Value: T);
begin
FData[Index - FOffset] := Value;
end;
用法如下:
var
arr: TDynArray<Integer>;
I: Integer;
begin
arr := TDynArray<Integer>.Create(512, 1024);
for I := arr.Low to arr.High do
arr[I] := I;
for I := arr.Low to arr.High do
Writeln(I, '=', arr[I]);
Readln;
end;
答案 1 :(得分:3)
动态数组始终基于零。如果要使用具有不同基数的数组索引,则需要封装考虑到索引偏移量的数组访问。像这样:
const
Offset = 512;
function GetValue(Index: Integer): Byte;
begin
Result := Arr[Index - Offset];
end;
procedure SetValue(Index: Integer; Value: Byte);
begin
Arr[Index - Offset] := Value;
end;
答案 2 :(得分:0)
此外,还有sparse array (sparse matrix)的概念。 Delphi不立即提供支持,但是如果我没记错的话,TurboPower SysTools中有一些实现。
该消息来源被放到SourceForge上,大约15年前该公司关闭时: https://sourceforge.net/projects/tpsystools/
但是这些已经很久没有更新了。
这似乎也是同一个库,也许是最新的: https://github.com/TurboPack/SysTools