Next: , Previous: String schema, Up: Znakovni nizovi u GPC-u



3.4.2 Preklapanje nizova u variant record-ima

Q: Da li bi različite varijante u varijant record-u trebale zapadati u istu memorijsku lokaciju? Prethodni Pascali koje sam koristio su ovo garantirali, i napisao sam low-level kod koji se oslanja na to. Varijante nisu iste duljine, niti je bila namjera da budu.

A: Ne, namjerno je učinjeno da diskriminante nisu preklopljene u memoriji, da bi se one mogle biti ispravno inicijalizirati prije svega. Razmotrite:

     record
     case Boolean of
       False: (s1: String (42));
       True:  (s2: String (99));
     end;

Ako bi se nizovi preklapali, posebno bi njihove diskriminante zauzimale isto mjesto u memoriji. Kako bi onda trebale biti inicijalizirane? Na bilo koji način, bilo bi krivo za barem jednu od varijanti ...

Dakle, nakon diskusije u ISO Pascal newsgroup-i gdje se ovo pitanje pojavilo u vezi s varijablama (koje također zahtijevaju nešto automatske inicijalizacije i finalizacije), odlučili smo da napravimo ovo u GPC-u za sve tipove s automatskom inicijalizacijom i finalizacijom (trenutno datoteke, objekti i sheme (schemata), uključujući i znakovne nizove, u budućnosti bi to također mogle biti i Delphi kompatibilne klase i finalizirani tipovi), budući da standard ionako ne garantira za iste da su u preklapanom memorijskom području (engl. overlay) ...

Postoje dva načina u GPC-u da se dobije garantirano preklapanje memorije (oba nestandardna, naravno, budući da standard ne pretpostavlja ništa o internim reprezentacijama; ali su oba BP-kompatibilna), absolute deklaracije i varijabilno dodjeljivanje tipova (variable type casts). Npr. da bi se preklapalo polje bajtova b sa varijablom v:

     var
       b: array [1 .. SizeOf (v)] of Byte absolute v;

Ili možete koristiti dodjelu tipa:

     type
       t = array [1 .. SizeOf (v)] of Byte;

nakon čega t (v) može biti korišten kao polje preklopljeno (u memoriji se nalazi na istom mjestu) sa v.