Typ będący złożoną strukturą, logicznie powiązanych z sobą zmiennych dowolnego typu traktowanych jako nierozłączna całość. Zmienne wchodzące w skład rekordu nazywane się polami.

Deklaracja rekordu jako typu

Typ rekordowy deklaruje się w bloku type programu lub modułu. Schemat deklaracji typu rekordowego:

IdentyfikatorTypu = record
    Indentyfikator1 : typ;
    Indentyfikator2 : typ;
    Indentyfikator3 : typ;
         ...
    IndentyfikatorN : typ;
end;

Gdzie:

  • IdentyfikatorTypu to nazwa identyfikująca deklarowany typ
  • Identyfikator1, Identyfikator2, Identyfikator3 … IdentyfikatorN to nazwy kolejnych pól
  • typ to dowolny typ pola

Przykład:

TOsoba = record
    Imie, Nazwisko : string;
    Adres : TAdres;
    Wiek : integer;
    Wzrost : integer;
end;

Deklaracja rekordu jako zmiennej

FreePascal oraz Delphi pozwalają na deklarację rekordu bez potrzeby deklarowania nowego typu danych, bezpośrednio w bloku var. Schematycznie wygląda to następująco:

IdentyfikatorZmiennej : record
    Pole1 : Typ;
    Pole2 : Typ;
         ...
    PoleN : typ
end;

Dostęp do pól rekordu

Aby uzyskać dostęp do zawartości pola rekordu, należy użyć operatora kropki między identyfikatorem rekordu a identyfikatorem pola.

Przykład:

var
    OsobaFoo : TOsoba;

begin
    OsobaFoo.Imie :='Jan';
    OsobaFoo.Nazwisko :='Kowalski';
    WriteLn(OsobaFoo.Imie, OsobaFoo.Nazwisko);
end.

Rekord z wariantami

Rekord z wariantami to rekord, którego część (lub całość) układu pól zależna jest od wartości pola znacznikowego. Rekord z wariantami składa się z części stałej (zawierającej pola niezależne od wariantu) oraz części zmiennej, będącej deklaracją pól wariantowych (pól zależnych od wariantu). Deklaracja pól wariantowych musi zawsze znajdować się na końcu deklaracji rekordu.

Schemat deklaracji:

TIdentyfikator = record
 Identyfikator1 : Typ;
 Identyfikator2 : Typ;
 Identyfikator3 : Typ;
         ...
 case Pole_znacznikowe : TypPorzadkowy of
     Wartosc1 : (Pole1 : Typ, Pole2 : Typ, ...);
     Wartosc2 : (PoleA : Typ, PoleB : Typ, ...);
                 ...
     WartoscN : (PoleFoo : Typ, PoleBar : Typ, ...);
end;

Gdzie:

  • TIdentyfikator to identyfikator nowego typu
  • Identyfikator1, Identyfikator2, Identyfikator3 to identyfikator pól stałych
  • Typ to dowolny typ pola
  • Pole_znacznikowe to identyfikator pola znacznikowego. Pole znacznikowe musi być typu porządkowego!
  • Wartosc1, Wartosc2, WartoscN to wariant wartości pola znacznikowego
  • Pole1, Pole2, PoleA itd. to identyfikatory pól wariantowych, dla danej wartości pola znacznikowego.

Przykład:

type TPozycjaTyp = (KSIAZKA, WITRYNA, INNE);TPozycja = record
     Tytul : string[30];
     Autor : string[30];
     case Typ : TPozycjaTyp of
         KSIAZKA : (ISBN : Longint;  Wydawnictwo : string[30]);
         WITRYNA : (Adres : string[30]; Licencja : string[3]);
 end;

var
 Item1 : TPozycja;

begin
 Item1.Tytul := 'Westwolf na tropie gibonów';
 Item1.Autor := 'Gipki Gibon';
 Item1.Typ := KSIAZKA;
 Item1.ISBN := 1111111111;
 Item1.Wydawnictwo := 'NOWA ERA';
 WriteLn(Item1.ISBN);
end.

Istnieje również możliwość deklaracji rekordu wariantowego bez dostępu do pola znacznikowego. Deklaruje się go pomijając identyfikator pola znacznikowego.

Przykład :

TLongNumer = record
    case byte of
        1: (LongNumber : LongInt);
        2: (Li, Hi : integer);
end;

Rozmiar rekordu

Rozmiar zajmowanej pamięci przez rekord składający się tylko z pól stałych, jest równy sumie rozmiarów jego pól.

W rekordach z wariantami, pamięć rezerwowana dla pól wariantowych jest równa wariantowi, którego łączny rozmiar pól, jest największy. Całkowity rozmiar pamięci rezerwowanej dla rekordu z wariantami jest równa sumie pamięci rezerwowanej dla pól stałych, pola znacznikowego oraz pól wariantowych.

Oznacza to, że w danym momencie tylko jeden wariant pól, wskazywany przez pole znacznikowe, pozwala odczytać poprawne dane przechowywane przez rekord. Odczyt lub przypisanie wartości polu z poza aktywnego wariantu, może być przyczyną błędu logicznego.

0 Odpowiedzi do “Typ rekordowy”


  1. Brak komentarzy

Napisz odpowiedź