|
|
Data opslag in 2 dimensionale arrays |
|
|
Het computer geheugen is een lineaire lijst van bytes.
In 2 dimensionale arrays is data opgeslagen in rijen en kolommen.
We vragen ons af, hoe die rijen en kolommen in het geheugen staan.
Om dit te onderzoeken definiëren we een 1 dimensionaal array[0..99] met 100 bytes.
Ook definiëren we een 2 dimensionaal array[0..9,0..9]
met 10 rijen en 10 kolommen op dezelfde geheugen locaties.
Het 1 dimensionale array vullen we met de getallen 0,1,2,... elk veld dezelfde waarde als zijn index.
Dan lezen we de velden van het 2 dimensionale array en plaatsen die in een tabel van 10*10 velden.
Het programma
type TB = array[0..9,0..9] of byte;
PB = ^TB;
var a : array[0..99] of byte;
procedure TForm1.Button1Click(Sender: TObject);
//toon positie van data in een 10*10 array
var i,j : byte;
p : Pb;
begin
p := PB(@a);
for i := 0 to 99 do a[i] := i;
with paintbox1.canvas do
begin
font.Name := 'arial';
font.Height := 18;
font.Color := $80;
brush.Style := bsClear;
for j := 0 to 9 do
for i := 0 to 9 do
textout(15+i*40,10+j*40,inttostr(p^[i,j]));
end;
end;
Hieronder staat het resultaat
Er is, naast de pointers, een eenvoudiger manier om de arrays over elkaar te leggen:
var a : array[0..99] of byte;
b : array[0..9,0..9] of byte absolute a;
a en b gebruiken nu dezelfde geheugenruimte.
Wat leren we hier nu van?
Stel, we hebben een 2 dimensionaal array met cc kolommen en rr rijen: array[0..cc-1,0..rr-1]
Het element in kolom c en rij r wordt geadresseerd als arrayname2 [c,r]
Hetzelfde element wordt in het 1 dimensionale array geadresseerd als arrayname1[n]
1. omzetting van [c,r] naar n:
2.omzetting van n naar [c,r]:
c := n div rr;
r := n mod rr;
Een 1 dimensionaal array is sneller dan een 2 dimensionaal.
Als het echt op tijd aankomt dan is te overwegen om over een 2 dimensionaal array
ook een 1 dimensionaal array te leggen.
|
|