Wspolne pole - rekord wariantowy

0
 TRek = record
  case CosTam of
    0: (X: Integer);
    1: (Y: Float);
    2: (Z: Char);
  end;

Czy da sie zrobic by dla CosTam rownego 0 badz 1, dodac zmienna o tej samej nazwie i typie ?

0

o jakiej samej nazwie i typie?

0

cos takowego sie nie skompiluje:

 TRek = record
  case CosTam of
    0: (
         X: Integer;
         bb: byte;
        );
    1: (
         Y: Float;
         bb: byte;
        );
    2: (Z: Char);
  end;
0

no to wyobraź sobie

var rek:TRek;
...
writeln(rek.bb);

i które bb miałoby się wyświetlić?

masz do wyboru

TRek = record
  bb: byte;
  case CosTam of
    0: (X: Integer);
    1: (Y: Float);
    2: (Z: Char);
  end;

albo

TRek = record
  case CosTam of
    0: (
         X: Integer;
         bbx: byte;
        );
    1: (
         Y: Float;
         bby: byte;
        );
    2: (Z: Char);
  end;
0

intelisense wyswietla wszystkie pola, ale dostepne sa tylko te zaalokowane. Inaczej nie byloby sensu tego stosowac ?
Zmiana nazwy nie wchodzi w gre, a pierwszy sposob sprawia ze dla Costam = 2, jest zbedne pole.

0
serviceapp napisał(a)

pierwszy sposob sprawia ze dla Costam = 2, jest zbedne pole.

To go nie używaj. Albo zdeklaruj trzy osobne typy. Tego co sobie wyobrażasz, zrobić nie można.

0

heh.... No ale po to jest wariantowy, zeby tyle rezerwowac ile trzeba ? A nie ze mam sobie go nie uzywac....
Rownie dobrze moge sobie 100 zmiennych wsadzic, i 99 nie uzywac ? :-P

0

heh.... No ale po to jest wariantowy, zeby tyle rezerwowac ile trzeba
Nie. Jest po to, by mieć różnoraki dostęp do tego samego obszaru pamięci.
Typ taki ma rozmiar stały, taki jak największy jego wariant. Jeśli jeden wariant zawiera integera, a drugi tablicę z tysiącem integerów, w pierwszym wariancie po prostu reszta się "marnuje".

Zauważ, że NIGDZIE się nie wybiera, który wariant jest "aktualny". Dlatego nie ma możliwości stwierdzenia, do którego bb miałoby się odwoływać rek.bb

0

no po prostu malo jestem oblatany w tych wariantowych, wiec stad moje pytania.

Ale nie do konca sie z Toba zgadzam. Testowalem i gdy odwolywalem sie do stringa[4], ktory byl zgodny z typem wariantu, oraz do zmiennej typu byte, ktora nie byla zgodna z wariantem, to otrzymalem krzaki. (gdy dolozylem tego byte ogolnie, bez podzialow to wtedy bylo OK). Wiec jednak jakos to dziala :-)

0

ale dobra, po namysle juz chyba wszystko rozumiem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1