where : ibrtses delphi

Delphi - runtime defineable array

disclaimer

the source code of this page may not appear correctly in certain browsers
due to special characters. Have a look at the source of this HTML page
with notepad instead

Sometimes an array whose size can be defined at runtime
is considered useful. It works as template for any dimension
while here only 1D and 2D are shown.

unit VArrays;

interface
type
 IntArray=class
 protected
  fdata:pointer;
  fsize:integer;
  function getitem(index:integer):integer;
  procedure setitem(index,j:integer);
 public
  property Q[index:integer]:Integer read getitem write setitem; default;
  constructor create(size:integer);
  destructor destroy; override;
  procedure clear;
 published
  property count:integer read fsize;
 end;


Int2DArray=class
 protected
  fdata:pointer;
  fsizex,fsizey:integer;
  function getitem(index1,Index2:integer):integer;
  procedure setitem(index1,Index2:integer;j:integer);
 public
  property Q[index1,Index2:integer]:integer read getitem write setitem; default;
  constructor create(x,y:integer);
  destructor destroy; override;
  procedure clear;
 published
  property countx:integer read fsizex;
  property county:integer read fsizey;
 end;

implementation

type
 IntPtr=^integer;

function IntArray.getitem(index:integer):integer;
var p:IntPtr;
    k:integer absolute p;
begin
 p:=fdata;
 k:=k+index*sizeof(integer);
 result:=p^;
end;
procedure IntArray.setitem(index,j:integer);
var p:IntPtr;
    k:integer absolute p;
begin
 p:=fdata;
 k:=k+index*sizeof(integer);
 p^:=j;
end;
constructor IntArray.create(size:integer);
begin
 inherited create;
 GetMem(fdata,size*sizeof(integer));
 fsize:=size;
end;
destructor IntArray.destroy;
begin
 FreeMem(fdata,fsize*sizeof(integer));
 inherited destroy;
end;
procedure IntArray.clear;
begin
 FillChar(fdata^,fsize*sizeof(integer),0);
end;


function Int2DArray.getitem(index1,Index2:integer):integer;
var p:IntPtr;
    k:integer absolute p;
begin
 p:=fdata;
 k:=k+(index1+Index2*fsizex)*sizeof(integer);
 result:=p^;
end;
procedure Int2DArray.setitem(index1,Index2:integer;j:integer);
var p:IntPtr;
    k:integer absolute p;
begin
 p:=fdata;
 k:=k+(index1+Index2*fsizex)*sizeof(integer);
 p^:=j;
end;
constructor Int2DArray.create(x,y:integer);
begin
 inherited create;
 fsizex:=x; fsizey:=y;
 GetMem(fdata,fsizex*fsizey*sizeof(integer));
end;
destructor Int2DArray.destroy;
begin
 FreeMem(fdata,fsizex*fsizey*sizeof(integer));
 inherited destroy;
end;
procedure Int2DArray.clear;
begin
 FillChar(fdata^,fsizex*fsizey*sizeof(integer),0);
end;

end.

notes

   use :
    var myi:IntArray;

    myi:=IntArray.create(10);  //  [0..9]
    myi[1]:=0;
The datatype here is fixed to integer but can easily be changed to any other. This is a core structure and may be extended to :

Note that in D2 and in D3, the array property could be published. In D5 array properties have to be public.



Feedback is welcome





sponsored links




Delphi
home

last updated: 18.dec.01

Copyright (99,2001) Ing.Büro R.Tschaggelar