Record/pl
│
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.
{$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) |
|
Tylko typy zarządzane | Tylko typy zarządzane | Tylko typy zarządzane | Wszystkie pola |
|
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
- Rekordy
record, poradnik dotyczący rekordów - Obiekty
object - Klasy
class - Nowe funkcje FPC 3.2.0 — Stałe tablice dynamiczne i inicjalizacja zmiennych
| simple data types |
|
|---|---|
| complex data types |