Page 1 of 3

[Prog]Problemen bij het vak `Inleiding programmeren`

Posted: Sat Jan 06, 2007 8:59 pm
by Sem
De laatste lessen `Inleiding programmeren` zijn niet bij iedereen even goed doorgedrongen, althans niet bij mij. ( Waarschijnlijk omdat ik geen informaticus ben. ) Vandaar de volgende vragen aan jullie:

1) Kan iemand type-test en type-guard even met handen en voeten uitleggen ( lees als : zo duidelijk mogelijk ).
2) Zou iemand tenslotte op een eenvoudige manier kunnen uitleggen wat er op p.164 van de cursus wordt gezegd over "het addertje onder het gras" ( quote ) bij de toekenning w1:=w2.

Alvast bedankt voor de hulp
en tot maandag
veel succes trouwens !!!

Posted: Sat Jan 06, 2007 11:04 pm
by Jerre
Hoi,

Wel ik heb vaag idee ;)

typetests kijken (zoals de naam doet vermoeden) of een variabele van een bepaald type is.

Typeguards houden in het oog of de types we voldaan zijn ;)

Nu uw addertje, volgens mij wordt er bedoeld dat uw w1 een record veld moet hebben om die w2.c te ontvangen :)

Hoe dan ook ik kan me vergissen aangezien het al wat laat is en ik al te lang op ben ;)

Posted: Sat Jan 06, 2007 11:20 pm
by Phil
van typetest en typeguard klopt wat jerre zegt, als je het in OO wil toepassen krijg je zoiets
1: met polymorfisme
PROCEDURE (punt: Point) VoerUit;
PROCEDURE (punt: Point3D) VoerUit;
PROCEDURE (punt: Point4D) VoerUit;

Bij polymorfisme wordt dit dynamisch type dan telkens nagekeken en hierna wordt de code uitgevoerd (het is dus een interne typetest/typeguard). Als je dit manueel wil toepassen krijg je dit:

PROCEDURE (punt: Point) VoerUit;
BEGIN
IF (punt IS Point3D) THEN (instructies..)
IF (punt IS Point4D) THEN (instructies..)
ELSE ....
END;
END VoerUit;

Dat addertje onder het gras weet ik ook niet meer :? maar ik dacht dat het iets met pointers te maken had? Dat de een een de-referentie is (wijst dus naar het juiste adres) en bij het andere vul je gewoon het record veld in.

Posted: Sat Jan 06, 2007 11:27 pm
by Jerre
Phil ben je iets vergeten in je uitleg? Die 1 bij polymorfisme intrigeert me ;)

Posted: Sun Jan 07, 2007 12:29 am
by j0lle
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 :)

Posted: Sun Jan 07, 2007 12:31 am
by cG`
zo dacht ik het ook dus tis maar een heel klein addertje dan ;)

Posted: Sun Jan 07, 2007 12:33 am
by j0lle
cG` wrote:zo dacht ik het ook dus tis maar een heel klein addertje dan ;)
ja idd :) het is wel onnodig da hij da erbij zet, zorgt alleen maar voor verwarring.

Posted: Sun Jan 07, 2007 12:46 am
by Robbe
j0lle wrote:nu komen we bij het addertje:
w1 := w2; moet uitgevoerd worden alvorens we gebruik kunnen maken van w1.c, and that's it :)
Jammergenoeg gaat w1.c nooit lukken het type van w1 geen c heeft. Hiervoor zijn de typeguards nodig en moet je dus w1(TweedeUitbrWijzer)^.c gebruiken.

Posted: Sun Jan 07, 2007 8:31 am
by Phil
Jerre wrote:Phil ben je iets vergeten in je uitleg? Die 1 bij polymorfisme intrigeert me ;)
dnno, niet dat'k weet.. maar je kan dat voorbeeld nog verder uitwerken. Stel punt: Point is je basis en de rest zijn uitbreidingen

TYPE
Point = POINTER TO Punter;
Punter = RECORD
nul: INTEGER;
naam: ARRAY 20 OF CHAR;
END;

LuxePoint = POINTER TO Luxe;
Luxe = RECORD
code: INTEGER;
END;


PROCEDURE (punt1: Point) Doe*;
BEGIN
In.Int(punt1.nul);
In.String(punt1.naam);
END;

PROCEDURE (punt2: LuxePoint) Doe*;
BEGIN
punt2.Doe^;
In.Int(punt2.code);
END;

Voila, die "^" voert dan gewoon In.Int(punt2.nul) enzo uit..

Posted: Sun Jan 07, 2007 9:59 am
by Jerre
Robbe wrote:
j0lle wrote:nu komen we bij het addertje:
w1 := w2; moet uitgevoerd worden alvorens we gebruik kunnen maken van w1.c, and that's it :)
Jammergenoeg gaat w1.c nooit lukken het type van w1 geen c heeft. Hiervoor zijn de typeguards nodig en moet je dus w1(TweedeUitbrWijzer)^.c gebruiken.
Zie dit is wat ik bedoel, je moet zorgen dat w1 een veld beschikbaar heeft om die w.c(woops 2 vergeten), w2.c op te vangen

Posted: Sun Jan 07, 2007 10:58 am
by Sem
Allemaal heel erg bedankt, ik begrijp het...

Posted: Sun Jan 07, 2007 4:24 pm
by Robbe
Jerre wrote:... om die w.c(woops 2 vergeten), w2.c ...
Daar is een knop voor znn, heet die niet backspace? :P

Posted: Sun Jan 07, 2007 4:26 pm
by Sem
Ik heb nog eens even dat boek Into the realm of Oberon bezien en daar staat dat wel goed in uitgelegd, khad daar beter wat vaker in gekeken en wat minder in de cursus. :?

Posted: Sun Jan 07, 2007 6:19 pm
by Jerre
Robbe wrote:
Jerre wrote:... om die w.c(woops 2 vergeten), w2.c ...
Daar is een knop voor znn, heet die niet backspace? :P
Welke informaticus gebruikt nu ooit backspace? ;) Wat je typt is altijd goed, enkel de computer vat dat niet goed op :D

Posted: Sun Jan 07, 2007 6:35 pm
by Robbe
Jerre wrote:
Robbe wrote:
Jerre wrote:... om die w.c(woops 2 vergeten), w2.c ...
Daar is een knop voor znn, heet die niet backspace? :P
Welke informaticus gebruikt nu ooit backspace? ;) Wat je typt is altijd goed, enkel de computer vat dat niet goed op :D
Gij hebt precies nog ni veel errors meegemaakt door typo's ;)