Record/pl
Deutsch · English · Español · Français · Magyar · Polski · Português · Suomi · Русский
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.
Note: 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
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
From the Free Pascal wiki, page "Record/pl", as it stood on 2023-01-25 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.
Talk about this page
Nobody has opened a bench for this page yet. Sign in to open one.
