het addertje heeft de maken met type-extensie van dynamische records.
Code: Select all
TYPE
BasisRecWijzer = POINTER TO BasisRecord;
BasisRecord =
RECORD
a: Type1;
END;
EersteUitbrWijzer = POINTER TO EersteUitbreiding;
EersteUitbreiding =
RECORD (BasisRecord)
b: Type2;
END;
TweedeUitbrWijzer = POINTER TO TweedeUitbreiding;
TweedeUitbreiding =
RECORD (EersteUitbreiding)
c: Type3;
END;
VAR
w0: BasisRecWijzer;
w1: EersteUitbrWijzer;
w2: TweedeUitbrWijzer;
het basisidee van wat hierboven staat zal je wel snappen.
stel nu dat je in je code
NEW(w1);
NEW(w2);
doet, dan beschik je over de velden:
w1.a
w1.b
en
w2.a
w2.b
w2.c
w1^ := w2^; is mogelijk
w2^ := w1^; is "verboden" (syntactisch)
(wat he hier doet is de WAARDEN die in je geheugen zitten doorgeven)
maar stel nu dat je doet:
w1 := w2; ?
dan wijst w1 naar hetzelfde adres in je geheugen als w2. je geeft hier dus een ADRES door, en GEEN WAARDE.
en na deze toekenning beschik je niet alleen over w1.a en w1.b, maar ook over w1.c, omdat je w1 dus "gelijksteld" aan w2
nu komen we bij het addertje:
w1 := w2; moet uitgevoerd worden alvorens we gebruik kunnen maken van w1.c, and that's it
edit: tgeen hier sta is ni volledig just, maar tis toch al te laat om te gaan aanpasse
