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 array
s 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 |