Sign in Join
Wiki copytemporary

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

pascal
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.:

pascal
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:

pascal
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:

pascal
    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:

pascal
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:

pascal
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

pascal
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


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.

Revision 1, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.