Page 1 of 1

OO programmeren Vraagje

Posted: Tue Dec 13, 2005 10:04 pm
by Nickman
Waarom wil dit niet werken :(

Code: Select all

TYPE
		Element* = POINTER TO ElementNode;
		ElementNode = RECORD
			END;
		RealElement* = POINTER TO RealElementNode;
		RealElementNode =
			RECORD (ElementNode)
				r: REAL;
			END;
		BooleanElement* = POINTER TO BooleanElementNode;
		BooleanElementNode =
			RECORD (ElementNode)
				b: BOOLEAN;
			END;
				
		MATRIX* = POINTER TO MATRIXDesc;
		MATRIXDesc =
			RECORD
				matrix*: ARRAY 4 OF ARRAY 4 OF Element;
			END;

PROCEDURE (M : MATRIX) InitRealElement*();
	VAR
		x, y : INTEGER;
BEGIN
	FOR y := 0 TO 3 DO
		FOR x := 0 TO 3 DO
			M^.matrix[x, y](RealElement)^.r := 0.0;
		END;
	END;
END InitRealElement;
De benamingen zijn allemaal juist want compiler geeft geef fouten, maar hij doet het gewoon niet.
Ik laat deze procedure alsvolgd oproepen:

Code: Select all

NEW(A);
A^.InitRealElement();
please help :)

Re: OO programmeren Vraagje

Posted: Tue Dec 13, 2005 10:12 pm
by Shinta
Nickman wrote:Waarom wil dit niet werken :(

Code: Select all

TYPE
		Element* = POINTER TO ElementNode;
		ElementNode = RECORD
			END;
		RealElement* = POINTER TO RealElementNode;
		RealElementNode =
			RECORD (ElementNode)
				r: REAL;
			END;
		BooleanElement* = POINTER TO BooleanElementNode;
		BooleanElementNode =
			RECORD (ElementNode)
				b: BOOLEAN;
			END;
				
		MATRIX* = POINTER TO MATRIXDesc;
		MATRIXDesc =
			RECORD
				matrix*: ARRAY 4 OF ARRAY 4 OF Element;
			END;

PROCEDURE (M : MATRIX) InitRealElement*();
	VAR
		x, y : INTEGER;
BEGIN
	FOR y := 0 TO 3 DO
		FOR x := 0 TO 3 DO
			M^.matrix[x, y](RealElement)^.r := 0.0;
		END;
	END;
END InitRealElement;
De benamingen zijn allemaal juist want compiler geeft geef fouten, maar hij doet het gewoon niet.
Ik laat deze procedure alsvolgd oproepen:

Code: Select all

NEW(A);
A^.InitRealElement();
please help :)
ge moet r en b ook exporteerbaar maken, me een sterreke dus, en best je record ok

Posted: Tue Dec 13, 2005 10:41 pm
by Nickman
Same prob en heb alles wa ik maar kon laten exporteren :)

Posted: Wed Dec 14, 2005 10:18 am
by Yo_rik
De NEW die je doet voorziet alleen plaats voor de matrix, met de elementpointers. Voor de elementpointers moet je dus ook een NEW doen, en wel voor realelementpointers. Daarna kan je een element van de matrix naar dat realelement laten wijzen.

dus zoiets :):

Code: Select all

PROCEDURE (M : MATRIX) InitRealElement*(); 
   VAR 
      x, y : INTEGER;
      real: RealElement;

BEGIN 
   FOR y := 0 TO 3 DO 
      FOR x := 0 TO 3 DO 
         NEW(real);
         real^.r := 0.0;
         M^.matrix[x, y] := real; 
      END; 
   END; 
END InitRealElement;

Posted: Wed Dec 14, 2005 11:05 am
by Nickman
Thx, nu werkt het wel :D.
Gewoon vergeten dat die waarde eigenlijk ook een pointer was :)
Zal zo nog een paar dingen moeten aanpassen ;)

greetz

Posted: Wed Dec 14, 2005 1:50 pm
by Nickman
Hmm, mijn initializatie werkt nu al, maar de eenheidsmatrix doet heel vreemd...

Code: Select all

PROCEDURE (M : MATRIX) Unity*();
(* 
	Doel: De Eenheidsmatrix teruggeven.
	Return type: MATRIX
*)
	VAR
		x, y: INTEGER;
	
BEGIN
	FOR y := 0 TO 3 DO
		FOR x := 0 TO 3 DO
				M^.matrix[x, y]^.Unity(x, y);
		END;
	END;
END Unity;

PROCEDURE (i : Element) Unity(x, y: INTEGER);
BEGIN
	i := NIL;
END Unity;

PROCEDURE (i : RealElement) Unity(x, y: INTEGER);
BEGIN
	IF (x # y) THEN
		i^.r := 0.0;
	ELSE
		i^.r := 1.0;
	END;
END Unity;

PROCEDURE (i : BooleanElement) Unity(x, y: INTEGER);
BEGIN
	IF (x = y) THEN
		i^.b := TRUE;
	ELSE
		i^.b := FALSE;
	END;
END Unity;
ipv dus alleen op de As 1.0 toe te voegen, voegt hij op elke plaats een 1.0 toe :shock:.
Heb al gebrobeerd met de IF lus anders te schrijven (zoals in deze code), maar die blijft da doen :|
En bij mijn initializatie staan er wel degelijk overal nullen in.

Posted: Wed Dec 14, 2005 5:14 pm
by Arutha
Ik werk met ne return en dan lukt da zonder veel probleme.
Dees is't voorbeeld voor de real.
Da heel programma sta hier:
http://home.scarlet.be/~vp034593/MatrixExt.Arc
't kan ni veel meer dan wa gegevens der in steke en unity ma 't werkt normaal wel.

Code: Select all

  PROCEDURE (e: realellement) Set (i,j : INTEGER): ellement;
	                VAR
		BEGIN
			IF j = i THEN
				e^.data := 1;
			ELSE
				e^.data := 0;			
			END;						
		RETURN e;
	END Set;

PJ

Posted: Wed Dec 14, 2005 5:33 pm
by Nickman
Mja, ik zal het is proberen met ne return, misschien dat het iets helpt...
Ik hou u op d ehoogte :)

Hebbet geprobeerd, maar blijft overal eentjes zetten :s
----------------

Heb ontdekt dat het niet aan mijn unity procedure lag, maar aan mijn Write procedure :shock:
Effe kijken...

----------------
Nu liegt het blijkbaar aan het eteruggeven van de matrix naar waar ik hem heb opgeroepen :s

Ik wordt er zot van!!!

Posted: Wed Dec 14, 2005 6:16 pm
by Shinta
Yo_rik wrote:De NEW die je doet voorziet alleen plaats voor de matrix, met de elementpointers. Voor de elementpointers moet je dus ook een NEW doen, en wel voor realelementpointers. Daarna kan je een element van de matrix naar dat realelement laten wijzen.

dus zoiets :):

Code: Select all

PROCEDURE (M : MATRIX) InitRealElement*(); 
   VAR 
      x, y : INTEGER;
      real: RealElement;

BEGIN 
   FOR y := 0 TO 3 DO 
      FOR x := 0 TO 3 DO 
         NEW(real);
         real^.r := 0.0;
         M^.matrix[x, y] := real; 
      END; 
   END; 
END InitRealElement;
ij zegt ni veel ma tis tog nen toffe den yorik :D khad ook die fout, nu nimeer dus, merci !!! Nu werkt alles bij mij