是否可以将内存分配给具有特定索引的动态数组?

时间:2018-07-30 10:46:56

标签: delphi

假设我有动态数组

type TCharArr = Array of byte;
type PcharArr = ^TCharArr;
var charArr: PcharArr;

我想用New(charArr);在堆中分配内存;

但是,如何指定大小和索引?动态数组是否可以具有索引,例如。从512 ..到1024?

3 个答案:

答案 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