Ook ik was, ter voorbereiding van het practicumexamen, bezig met een eenvoudige lijstmodule te schrijven. Allemaal goed en wel, maar ik zit met een probleem bij het testen van mijn module.
In de module List.Mod doe ik de volgende typedeclaraties:
Code: Select all
TYPE
ListPtr* = POINTER TO ListRec;
NodePtr* = POINTER TO NodeRec;
ListRec* = RECORD
first : NodePtr;
current* : NodePtr;
aantal* : INTEGER;
END;
NodeRec* = RECORD
next : NodePtr;
prev : NodePtr;
END;
Code: Select all
PROCEDURE (list : ListPtr) Init*;
BEGIN
list.first := NIL;
list.current := NIL;
list.aantal := 0;
OutExt.String("----------------");
OutExt.Ln;
OutExt.String("Lijst geinitialiseerd.");
OutExt.Ln;
END Init;
PROCEDURE (list : ListPtr) GoFirst*;
BEGIN
list.current := list.first;
PROCEDURE (list : ListPtr) Add*(node : NodePtr);
(* Procedure om 1 afzonderlijke node tussen current en next in te voegen *)
BEGIN
INC(list.aantal);
IF (list.aantal = 1) THEN
list.first := node;
list.current := node;
OutExt.String("Nieuwe eerste node...");
OutExt.Ln;
ELSE
node.next := list.current.next;
list.current.next := node;
node.prev := list.current;
list.current := node;
OutExt.String("Node toegevoegd.");
OutExt.Ln;
END;
END Add;
Code: Select all
MODULE ListTest;
IMPORT
OutExt, List;
TYPE
NodeExtPtr = POINTER TO NodeExt;
NodeExt = RECORD (List.NodeRec)
waarde : INTEGER;
END;
PROCEDURE Run*;
VAR
l : List.ListPtr;
n : NodeExtPtr;
BEGIN
NEW(l);
l.Init;
NEW(n);
n.waarde := 1;
l.Add(n);
n.waarde := 2;
l.Add(n);
n.waarde := 9;
l.Add(n);
l.GoFirst;
OutExt.Int(l.current.waarde, 0);
OutExt.Ln;
END Run;
END ListTest.
Komt dit omdat in de procedure List.Mod er helemaal geen veld 'waarde' in het type NodeRec staat? Hoe kan ik dit oplossen? Het moet toch mogelijk zijn hier een extensie op te maken...
Elias