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 |