Record/pl

From Free Pascal wiki
Jump to navigationJump to search

Deutsch (de) English (en) español (es) suomi (fi) français (fr) magyar (hu) polski (pl) português (pt) русский (ru)

Rekord to wysoce ustrukturyzowany typ danych w Pascalu. Jest on szeroko stosowany w Pascalu do logicznego grupowania elementów danych.

Chociaż proste struktury danych, takie jak arrays lub zbiory składają się z elementów tego samego typu, rekord może składać się z wielu elementów różnych typów i mogą mieć ogromną złożoność. Każda oddzielna część rekordu jest określana jako pole.

Słowo record jest słowem zastrzeżonym.

Deklaracja

Struktura stała

type
	TMember = record
		firstname, surname : string;
		address: array [1..3] of string;
		phone: string;
		birthdate: TDateTime;
		paidCurrentSubscription: boolean
	end;

Struktura zmienna

Możliwe są też bardziej złożone konstrukcje, np.:

type
  TMaritalState = (unmarried, married, widowed, divorced);
  TPerson = record
    // CZĘŚĆ STAŁA
    // oczywiście rekordy mogą być zagnieżdżone
    name: record
      first, middle, last: string;
    end;
    sex: (male, female);
    // Data urodzenia
    dob: TDateTime;
    // CZĘŚĆ ZMIENNA
    case maritalState: TMaritalState of
      unmarried: ( );
      married, widowed: (marriageDate: TDateTime);
      divorced: (marriageDateDivorced, divorceDate: TDateTime;
                 isFirstDivorce: boolean)			
  end;

Zauważ, że pola w części zmiennej muszą być ujęte w nawiasy. Nie możesz użyć tego samego identyfikatora wiele razy, więc nieco inna nazwa musi być użyta dla marriageDate w przypadku divorced.

Część zmienna współdzieli tę samą pamięć. Zatem marriageDate i marriageDateDivorced będą miały tę samą wartość niezależnie od maritalState. To zachowanie jest szczególnie praktyczne, co pokazuje poniższy przykład:

type
  TSpecialWord = record
    case Byte of
      0: (Word_value: Word);                      // 7
      1: (Byte_low, Byte_high: Byte);             // 7, 0
      2: (Bits: bitpacked array [0..15] of 0..1); // 1, 1, 1, 0, 0, ...
  end;

Rekord ten ma tylko część zmienną i umożliwia dostęp do wartości słowa, poszczególnych bajtów, a nawet bitów. Identyfikator nie jest koniecznie wymagany w klauzuli case, więc nie zajmuje to żadnej pamięci. Rozmiar tego rekordu to dwa bajty. W przypadku tablicy Bits jest to możliwe tylko wtedy, gdy użyjemy jej ze słowem bitpacked. Zwróć uwagę na kolejność bajtów, gdzie mniej znaczący bajt (LSB) znajduje się na pierwszym miejscu.

Rekord zaawansowany

„Rekord zaawansowany” to rekord z metodami i właściwościami.

Light bulb  Uwaga: Pamiętaj, aby dodać dyrektywę kompilatora {$modeSwitch advancedRecords} (po ustawieniu trybu).

Adresowanie

Pola

Dostęp do poszczególnych pól uzyskuje się poprzez umieszczenie kropki między nazwą rekordu a nazwą pola w ten sposób:

	a.firstname := 'George';
	a.surname := 'Petersen';
	a.phone := '789534';
	a.paidCurrentSubscription := true;

Alternatywnie, całą serię pól można udostępnić razem za pomocą konstrukcji with:

with a do
begin
	firstname := 'George';
	surname := 'Petersen';
	phone := '789534';
	paidCurrentSubscription := true
end;

Instancje

Rekord jest traktowany przez program jako pojedynczy byt i np. można skopiować cały rekord (o ile kopia jest tego samego typu) w ten sposób:

var
	a, b: TMember;

(* main program *)
begin
	// ... przypisz wartości pól rekordu a
	b := a
	// Teraz b przechowuje _kopię_ a.
	// Nie pomyl tego z referencjami:
	// a i b nadal wskazują na _różne_ _instancje_ TMember.
end.

Rekord stały

type
	// definicja rekordu
	TSpecialDay = record
		dayName: string;
		month: integer;
		day: integer;
	end;

const
	// stała typu TSpecialDay
	childrensDay: TSpecialDay = (
		dayName: 'Dzień Dziecka';
		month: 6;
		day: 1;
	);

// od FPC 3.2.0 możesz zdefiniować stałą tablicę rekordów w ten sposób
const
   SpecialDays: array of TSpecialDay = (
     ( dayName: 'Dzień Dziecka' ; month: 6; day: 1),
     ( dayName: 'Nowy Rok'; month:  1; day:  1)
   );

Rekordy w porównaniu z innymi typami strukturalnymi

Funkcja Rekord Rekord zaaw. Obiekt Klasa
Enkapsulacja (łączenie danych i metod + ukrywanie widoczności) Nie Tak Tak Tak
Dziedziczenie Nie Nie Tak Tak
Konstruktor i destruktor klasy Nie Tak Tak Tak
Polimorfizm (metody wirtualne) Nie Nie Tak Tak
Przydział pamięci Stos Stos Stos Sterta (Tylko)
Ustawianie pól na zero przy alokacji
Tylko typy zarządzane Tylko typy zarządzane Tylko typy zarządzane Wszystkie pola
Funkcja Default() zwraca stałą gdzie
wszystkie pola są zerami wszystkie pola są zerami wszystkie pola są zerami zwraca wartość nil
Przeciążanie operatora (globalne) Nie Tak Tak Tak
Przeciążanie operatora (tylko typ) Nie Tak Nie Nie
Definiowanie helperów Nie Tak Nie Tak
Konstruktory wirtualne, referencje klasy Nie Nie Nie Tak
Część wariantu (case) jako unia c/c++ Tak Tak Nie Nie
Bitpacked (realne pakowanie) Tak Tak Nie Nie

Zmodyfikowano z pomocą https://forum.lazarus.freepascal.org/index.php/topic,30686.30.html (autor oryginału: ASerge).

Zobacz także


navigation bar: data types
simple data types

boolean byte cardinal char currency double dword extended int8 int16 int32 int64 integer longint real shortint single smallint pointer qword word

complex data types

array class object record set string shortstring