MILC logo

IndexVorigeVolgendeLeeg

Variant records
Genic Clubguide, 00-00-00


    
EEN BEETJE PASCAL:

               V A R I A N T   R E C O R D S
              ===============================

Ik  merk dat er nog vrij veel programmeurs zijn die niet met 
variant-records om kunnen gaan. Sommigen hebben er zelfs nog 
nooit van  gehoord! Vandaar dat ik in deze tekst in het kort 
wil  uitleggen wat  zo'n variant-record  nou eigenlijk is en 
hoe u hem kunt gebruiken...


                     HET VARIANT-RECORD

Het doel  van een  variantrecord is het sparen van geheugen- 
ruimte  door toe te staan dat verschillende soorten gegevens 
(bijvoorbeeld integers,  strings en  booleans) op  verschil- 
lende  tijdstippen gebruik kunnen maken van de zelfde geheu- 
genruimte (locaties).

Als u  dit in  een array  toepast, dan  kunt u dus een array 
maken  waarvan ieder element een totaal andere structuur kan 
hebben.


Stel u heeft de volgende definitie :

type subtiep = 0..2
     varirec = record
                 case selectie : subtiep of
                   0 : (x : real);
                   1 : (y1 : byte;
                        y2 : integer);
                   2 : (z : string[10]);
               end; { merk op dat het case-statement niet
                      met een end wordt afgesloten }
var a : array[1..100] of varirec;

U  kunt  nu aan  de hand  van A[i].selectie  (deze variabele 
wordt tag-field  genoemd) aangeven  welke van  de 3 genoemde 
inhouden (dus x, y1/y2 of z) het arrayelement moet hebben.

Het  tag-field moet  u (uiteraard)  voor het  vullen van het 
record een bepaalde waarde geven.

Als selectie=0  dan bestaat  A[i].x; De  variabelen A[i].y1, 
A[i],y2  en  A[i].z  bestaan nu  NIET! Als  u het  tag-field 
gelijk aan 2 maakt dan bestaat A[i].z, en de rest niet...

U kunt  ten alle tijde het veld A[i].selectie uitlezen om er 
achter  te  komen  hoe  u  de  inhoud  van  het  betreffende 
arrayelement kunt interpreteren.

Opm:  U kunt  ook een  combinatie maken  van varianten  vast 
record. In dat geval moet het variant-deel achteraan staan.

Bijvoorbeeld: 

type voorbeeld = record
                   B : boolean;
                   A : array[1..10]  of  real;  
                   case i : boolean of          
                     false : (getal : byte);
                     true  : (teken : char);
                 end; { einde record }



               VARIANTRECORD ZONDER TAGFIELD 

Het is  ook mogelijk  om een  variantrecord te  maken zonder 
tagfield!  Op zich  klinkt dat vreemd, omdat u dan eigenlijk 
niet weet wat de inhoud van het record precies voorsteld.

In zo'n tagfieldloos variantrecord gelden op elk moment alle 
in het variant-deel vermelde variabelen.

Het grote verschil met een 'normaal' variantrecord is dat in 
de  versie   met  tagfield   op  verschillende   tijdstippen 
verschillende   variabelen  uit   het  variant-deel  gelden, 
terwijl in de tagfieldloze variant op het zelfde moment alle 
variabelen binnen het variant-deel gelden.

Soms kan  dit erg  nuttig zijn!  Denk bijvoorbeeld aan code- 
omzettingen o.i.d.

Met  het  volgende  programmaatje  worden de CHR- en de ORD- 
funkties nagebootst via een tagfieldloos variandrecord:


program tagfieldloos_voorbeeld;

type omzetter = record
                  case boolean of   { GEEN tagfield }
                    true  : (b : byte);
                    false : (c : char);
                end;

var q : omzetter;

begin
  q.b := 65;    { 65 is  de ASCII-waarde van de 'A' }
  writeln(q.c); { de letter 'A' op het scherm gezet }
  q.c := ' ';   { spatie. ASCII waarde 32           }
  writeln(q.b)  { het getal 32 wordt nu afgedrukt   }
end.


Een ander  voorbeeld zou  bijvoorbeeld een tekst-encoder/de- 
coder kunnen zijn.

U zet dan strings om naar een serie integers of reals o.i.d. 
waarop  u  vervolgens weer  een bepaalde  bewerking loslaat. 
Helemaal mooi  wordt het  als u voor het gecodeerde deel een 
combinatie van bijvoorbeeld integers en reals gebruikt...

Met variant-records  kunt u  erg mooie  dingen maken, mits u 
weet waar u mee bezig bent!


                                                 Rudy Oppers

    

Index

Vorige

Volgende