[Prog] Type-extensie probleem

Forum van 1ste Bachelor Informatica.

Moderator: Praesidium

Elias
Posts: 8
Contact:

[Prog] Type-extensie probleem

Post#1 » Thu Jan 18, 2007 10:28 pm

Goedenavond,

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; 
Hierbij horen de volgende procedures:

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;
In de module ListTest.Mod maak ik hier een extensie van, als volgt:

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. 
Het probleem begint bij het compileren. Ik krijg een foutmelding ('undefined record field') die naar de 4e laatste regel wijst (naar OutExt.Int(l.current.waarde, 0) ).
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

User avatar
Robbe
WOZ
Posts: 2161
Contact:

Re: [Prog] Type-extensie probleem

Post#2 » Thu Jan 18, 2007 10:35 pm

Elias wrote:

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;
Hier zou ik alle output uithalen, aangezien dit in het eindproduct meer dan waarschijnlijk niet gewenst is.
Elias wrote: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...
Het komt idd omdat in List.Mod geen 'waarde'-veld is. Je kan dit probleem 'oplossen' als je een typeguard gebruikt bij l
"I'm not afraid of falling, I'm afraid of landing" -- Sam
How To Ask Questions The Smart Way

Zingen? UKA-n dat ook!

Elias
Posts: 8
Contact:

Re: [Prog] Type-extensie probleem

Post#3 » Thu Jan 18, 2007 10:47 pm

Robbe wrote: Hier zou ik alle output uithalen, aangezien dit in het eindproduct meer dan waarschijnlijk niet gewenst is.
Elias wrote: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...
Het komt idd omdat in List.Mod geen 'waarde'-veld is. Je kan dit probleem 'oplossen' als je een typeguard gebruikt bij l
Ja, die text output ging ik er nog uithalen, het is maar dat ik op deze manier wat kan volgen wat mijn procedure allemaal doet (handig bij het testen).

Hoe moest dat nu weer met die typeguard? Ik weet nog dat ik het op het mondeling examen niet goed kon uitleggen. Den Arickx heeft het mij dan uitgelegd, maar ik ben het al weer kwijt :lol: .

User avatar
Robbe
WOZ
Posts: 2161
Contact:

Re: [Prog] Type-extensie probleem

Post#4 » Thu Jan 18, 2007 11:11 pm

Elias wrote:Den Arickx heeft het mij dan uitgelegd, maar ik ben het al weer kwijt :lol: .
I know the feeling :P

Voor die typeguards:

Code: Select all

... some code ...
OutExt.Int(l^.current(NodeExtPtr)^.waarde, 0);
... some code ...
Misschien iets handig voor in de toekomst (lees: de rest van je tijd in Oberon): aangezien je een object altijd via een pointer aanspreekt, kan je mss beter de pointer Klasse noemen en het record zelf (dat je toch alleen gebruikt bij extensies) KlasseRec of iets dergelijks. Zoals je het nu doet gaat het evengoed werken, daar niet van, maar ik heb die beslissing toen voor mezelf gemaakt omdat ik het maar nutteloos vond om speciaal een klasse te ontwerpen en dan zelden of nooit de echte naam te gebruiken, maar in de plaats Ptr erachter te zetten :lol:
"I'm not afraid of falling, I'm afraid of landing" -- Sam
How To Ask Questions The Smart Way

Zingen? UKA-n dat ook!

Elias
Posts: 8
Contact:

Re: [Prog] Type-extensie probleem

Post#5 » Thu Jan 18, 2007 11:14 pm

Robbe wrote:
Elias wrote:Den Arickx heeft het mij dan uitgelegd, maar ik ben het al weer kwijt :lol: .
I know the feeling :P

Voor die typeguards:

Code: Select all

... some code ...
OutExt.Int(l^.current(NodeExtPtr)^.waarde, 0);
... some code ...
Misschien iets handig voor in de toekomst (lees: de rest van je tijd in Oberon): aangezien je een object altijd via een pointer aanspreekt, kan je mss beter de pointer Klasse noemen en het record zelf (dat je toch alleen gebruikt bij extensies) KlasseRec of iets dergelijks. Zoals je het nu doet gaat het evengoed werken, daar niet van, maar ik heb die beslissing toen voor mezelf gemaakt omdat ik het maar nutteloos vond om speciaal een klasse te ontwerpen en dan zelden of nooit de echte naam te gebruiken, maar in de plaats Ptr erachter te zetten :lol:
Ok, merci voor de snelle uitleg. En ja, over die namen was ik in het begin nog aan het twijfelen. Nuja, zoveel maakt dat inderdaad niet uit :P .

Return to “1ste Bachelor”

Who is online

Users browsing this forum: No registered users and 49 guests