RECORD

Jaarvak op 7 studiepunten
Forumregels
Misschien werd je vraag al vorig jaar gesteld? Gebruik dus eerst de zoekoptie!

Er zijn formularia/samenvattingen aanwezig op de volgende link: viewtopic.php?f=19&t=93
Gebruikersavatar
hanssimi
Heeft dit forum graag
Heeft dit forum graag
Berichten: 188
Lid geworden op: 15 dec 2007, 16:59
Contacteer:

RECORD

Berichtdoor hanssimi » 24 jun 2008, 21:21

Joe!
effe een serieus vraagske ivm info

Weet iemand of t mogelijk is (en hoe);?

dus ge hebt een variabele, van type record
ma ge weet ni wa voor dingen da record bevat

is het op een of andere manier mogelijk om daar toch achter te komen???

vb om een procedure print te maken voor alle soorten records


wim? :p
wim
Master in de forumwetenschappen
Master in de forumwetenschappen
Berichten: 1991
Lid geworden op: 27 dec 2007, 21:40
Locatie: Sint-Pieters-Woluwe

Re: RECORD

Berichtdoor wim » 25 jun 2008, 14:00

't Is al te laat maar toch...
Nee, dat is onmogelijk (in modula-2 toch, volgend jaar in Java kan dat wel :)
Dat gaat dus niet omdat ge in modula-2 moet zeggen van welk type uw record is, en ge geen 'algemeen' type van een of ander soort record kunt maken.
Ge moet dus aparte print-procedures maken voor ieder soort record...

Nu ga ik mijzelf even tegenspreken, want eigenlijk kan het wel, maar op een vieze manier. Als ge het niet begrijpt is het niks (zoals ik zei, 't is toch al te laat), maar ik zal het toch maar even zeggen, voor de volledigheid:
De truuk is te werken met pointers (we love pointers).
Een pointer bevat een adres, en wijst dus naar een andere variabele.
Een pointer to Record1 wijst naar een Record1, een pointer to Record2 wijst naar Record2.
MAAR ge kunt op een slimme manier een pointer to Record1 laten wijzen naar een Record2. Zo:

MODULE Test;
FROM SYSTEM IMPORT ADR;
TYPE Record1 = RECORD
...
END;
TYPE Record2 = RECORD
...
END;
VAR record1Pt: POINTER TO Record1, record2Pt: POINTER TO Record2;

BEGIN
record1Pt := ADR( record2Pt^ );
END Test.

record1Pt wijst nu naar een Record2. Zo kunt ge een pointer laten wijzen naar wat ge wilt. Ge kunt dus aan uw print-procedure een pointer meegeven die ge laat wijzen naar Record1 of Record2 of... samen met een andere variabele om te zeggen naar wat de pointer wijst (welk type record) om het onderscheid te kunnen maken:

PROCEDURE Print( Pt: POINTER TO CARDINAL, type: CARDINAL ); (* ipv POINTER TO CARDINAL mag het ook POINTER TO REAL zijn, of TO CHAR, of TO POEMPERNIKKEL of TO wat dan ook, dat maakt niets uit *)
VAR record1Pt: POINTER TO Record1; record2Pt: POINTER TO Record2;
BEGIN
CASE type OF
0: record1Pt := ADR( Pt^ );
(* Print een record1 *)
| 1: record2Pt := ADR( Pt^ );
(* Print een record2 *)
END;
END Print;

En in het hoofdprogramma komt dan:

VAR record1: Record1; record2: Record2; Pt: POINTER TO CARDINAL;
BEGIN
Pt := ADR( record1 );
Print( Pt, 0 );
Pt := ADR( record2 );
Print( Pt, 1 );
END Test.

Probeer het niet te begrijpen, maar als ge het begrijpt, dan zijt ge heel goed bezig ;).
Afbeelding
- I only wear my sunglasses at night -
Aushim
Master in de forumwetenschappen
Master in de forumwetenschappen
Berichten: 2628
Lid geworden op: 23 nov 2007, 23:02
Locatie: Haren
Contacteer:

Re: RECORD

Berichtdoor Aushim » 25 jun 2008, 17:50

You're a crazy man, believe me

Terug naar “Informatica”

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers en 1 gast

cron