See also ebooksgratis.com: no banners, no cookies, totally FREE.

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
Rekord z wariantami - Wikipedia, wolna encyklopedia

Rekord z wariantami

Z Wikipedii

Rekord z wariantami jest to rodzaj rekordu, posiadającego tę właściwość, że zbiór rekordów posiada wspólny typ lecz różną postać, określoną aktualną wartością specjalnego pola znacznikowego.

Spis treści

[edytuj] Pola wariantowe

Rekord jest strukturą, agregatem danych, składającą się z pól rozmieszczonych kolejno w pamięci, zgodnie z deklaracją rekordu. W przypadku rekordu z wariantami, część pól – a konkretnie pól wariantowych – może być rozmieszczona w pamięci począwszy od tego samego adresu pamięci. Pola te (lub grupy pól stanowiące jeden z wariantów), mogą być różnego typu.

Przykład w języku Pascal:

 type adres=record
   kod : string[6];
   poczta : string[30];
   case wies : Boolean of
     True : (nazwa : string[25]; numer : integer);
     False: (ulica : string[30]; numer : integer
             mieszkanie : integer);
 end;
  • Jeżeli adres dotyczy wsi (wartość pola wies=True), to rekord składał się będzie z pól: kod, poczta, wies, nazwa, numer;
  • Jeżeli adres dotyczy miasta (wartość pola wies=False), to rekord składał się będzie z pól: kod, poczta, wies, ulica, numer, mieszkanie;

przy czym pole nazwa i ulica zlokalizowane będą w pamięci począwszy od tego samego adresu pamięci operacyjnej.

[edytuj] Pole znacznikowe

Wartość pola znacznikowego określa jaką postać ma aktualnie rekord, tzn. które pola wariantowe posiadają rzeczywiście, aktualnie, przypisaną prawidłową wartość. Pole znacznikowe może być polem anonimowym, tzn. nie posiadać jawnie określonej nazwy (tak może być np. w języku Pascal), ew. może być w ogóle niedostępne dla programisty (np. Algol 68), w rekordach z wariantami zawsze jednak takie pole występuje.

[edytuj] Porównanie z innymi konstrukcjami

Warianty zawarte w rekordzie są podobne do unii. Rekord wariantowy, składający się tylko z wariantów (bez pól poza wariantami), różni się od unii w zasadzie tylko występowaniem pola znacznikowego. Tak więc w unii wszystkie pola rozmieszczone są począwszy od tego samego adresu, a w rekordzie z wariantami mogą występować pola zwykłe rekordu, oraz pola wariantowe zawsze poprzedzone polem znacznikowym. Powyższe uwagi dotyczą także analogii jaką można dostrzec w odniesieniu do grupy deklaracji zmiennych rozmieszczonych przez programistę w pamięci począwszy od tego samego adresu (np. dyrektywą absolute w Turbo Pascalu).

Porównując rekordy z wariantami i „typ wariantowy”, występujący w niektórych językach programowania (np. Visual Basic), należy zauważyć, że

  • w typie wariantowym nie ma ograniczeń co do typu przypisywanych wartości, a w rekordzie z wariatami można przypisywać polom, tylko wartości typu zdefiniowanego w deklaracji rekordu, a więc lista typów jest ograniczona,
  • struktura i implementacja typu wariantowego jest ukryta, przy rekordach z wariatami implementacja należy do programisty.

[edytuj] Języki programowania

[edytuj] Ada

 record
   pola ...;
   [case wyróżnik is
     when wartość_1 => pola_wariantowe_1
     ...
     when wartość_n => pola_wariantowe_n
   end case;]
   [...
    pola
    [case wyróżnik is
      when wartość_1 => pola_wariantowe_1
      ...
      when wartość_n => pola_wariantowe_n
    end case;]]
   [...]
 end record;

[edytuj] Algol 68

Istnieje możliwość deklarowania unii (w rzeczywistości rekordów z wariantami) wyłącznie z pól całkowitych i logicznych, a pole znacznikowe jest ukryte, obsługa następuje automatycznie.

[edytuj] Modula 2

 RECORD
   pola ...
   [CASE pole_znacznikowe OF
     pola_wariantowe
   END]
   [pola ...
   [CASE pole_znacznikowe OF
     pola_wariantowe
   END]]
   [...]
 END

W Moduli 2 mogą występować wielokrotne pola wariantowe w tym samym rekordzie.

[edytuj] Pascal

 record
   pola ...;
   [case [pole_znacznikowe:]typ_porządkowy of
     wartość_1 : (pola_warianotwe_1);
     ...
     wartość_n : (pola_warianotwe_n);
 end;

Może wystąpić tylko jedna sekcja wariantowa na końcu rekordu.


aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -