tabl: array of integer
To jest właśnie tablica dynamiczna, nie zwykła = statyczna.
a w pascalu ?
type
buftype=array[0..16383]of integer; // 16384*sizeof(integer)=32KB < 65536 musi byc
pbuftype=^buftype;
myarray=array[0..8191]of pbuftype;
pmyarray=^myarray;
procedure przydziel(var tab:pmyarray;size:longint);
var i,j:word;
begin
i:=(size+16383)shr 14;
getmem(tab,i*sizeof(pbuftype)); // sizeof(pbuftype)=4;
i:=0;
while size>0 do
begin
j:=16384;
if(j>size)then j:=size;
size:=size-j;
getmem(tab[i],j*sizeof(integer));
inc(i);
end;
end;
procedure zwolnij(var tab:pmyarray;size:longint);
var i,j,k:word;
begin
k:=(size+16383)shr 14;
i:=0;
while size>0 do
begin
j:=16384;
if(j>size)then j:=size;
size:=size-j;
freemem(tab[i],j*sizeof(integer));
inc(i);
end;
freemem(tab,k*sizeof(pbuftype));
end;
// odwołania:
var t:myarray;
t[nr shr 14]^[nr and 16383]:=0; // lub
t[nr div 16384]^[nr mod 16384]:=1;
gdzie:
size - ilosc elementow
nr < size - numer elementu
indeksowanie elementów od 0
Dalej pozostaje tylko przerobienie tablicy jednowymiarowej na wielowymiarowa, przeliczenie np.x,y,z na nr... I tak jesli chcesz zasymulowac tablice 3d o wymiarach dz=2 x dy=3 x dx=4 (array[0..1,0..2,0..3]), to odpowiednio musisz przydzielic 234 komórek a każdy nr:=(((x3)+y)4)+x=z43+y*4+x (dla maksymalnych indeksów z=1, y=2 i x=3... nr:=12+8+3=23... czyli wszystko sie zgadza).
To tak samo jak z ekranem 320x200 przy trybie 13h... pixel o wspołrzednych 100,50 (od zera indeksując) jest w liniowym buforze pod adesem 50*320+100
Musisz pamiętać oczywiście ile komórek stworzyleś, ale to musisz znac, bo to ty przydzielasz pamieć ;>
Proste... wrecz banalne, orawda ?
// Te : shr 14 i and 16383 są zamiast: div 16384 i mod 16384 , operacje na bitach są po prostu szybsze, a 16384 i 8191 nie są przypadkowo dobrane. Btw. nie sprawdzałem, czy się skompiluje.