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:
    n := rr*c + r
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.