Struktura (programowanie)

Struktura lub rekord — to złożony typ danych występujący w wielu językach programowania, grupujący logicznie powiązane ze sobą dane różnego typu w jednym obszarze pamięci. Składowe struktury — pola — są etykietowane, tj. mają swoje unikatowe nazwy; poprzez podanie nazwy otrzymuje się dostęp do danego pola.

Struktury są powszechnie stosowane w programowaniu, pozwalają bowiem w przejrzysty sposób opisywać złożone obiekty. Przykładem struktury może być informacja o książce, której pola będą zawierały: imię i nazwisko autora (typ łańcuchowy), tytuł (typ łańcuchowy), rok wydania (liczba całkowita), liczba stron (liczba całkowita), nazwa wydawnictwa, numer ISBN itp.

W językach z silną typizacją, zanim zostanie stworzona zmienna typu rekordowego, musi zostać zdefiniowany odpowiedni typ opisujący strukturę rekordu; takie typy nazywa się typami rekordowymi lub po prostu rekordami.

Podobną strukturą danych są krotki, w których pola nie są identyfikowane nazwą, lecz indeksem. W odróżnieniu jednak od krotek, dopuszcza się modyfikację pól struktury.

Struktura w języku C[edytuj | edytuj kod]

 /* deklaracja */  struct miasto  {      long ludnosc;      char* rzeka;  };   /* definicja */  struct miasto Poznan;  Poznan.ludnosc = 550000;  Poznan.rzeka = (char*)malloc(sizeof(char)*6);  strncpy(Poznan.rzeka, "Warta\0", 6); 

Struktury w C mogą zawierać także pola zajmujące mniej niż 1 bajt. Aby zadeklarować takie pole, należy podać po dwukropku liczbę bitów.

 struct liczba {      unsigned int mlodszy_bajt :8;      unsigned int starszy_bajt :7;      unsigned int znak :1;  }; 

Pola bitowe mogą mieć typ int lub unsigned int. W tym pierwszym wypadku najstarszy bit będzie przeznaczony na znak danego pola.

Wyrównanie pól struktury[edytuj | edytuj kod]

W języku C (a także C++) rozmiar struktury może być większy niż suma rozmiarów poszczególnych pól struktury. Wynika to z umieszczania przez kompilator pól pod adresami wyrównanymi do granicy słowa maszynowego (zwykle 2, 4 lub 8 bajtów), co zapewnia szybszy dostęp przez mikroprocesor, ale jednocześnie utrudnia przekazywanie (np. przez sieć) lub zapis takich struktur.

Na przykład przyjmując wyrównanie do granicy 4 bajtów, poniższa struktura nie będzie zajmowała 5, lecz 8 bajtów:

struct { 	char a;          /* sizeof(a) = 1 */ 	int  b;          /* sizeof(b) = 4 */ } S;                     /* sizeof(S) = 8 */ 

Wyrównanie można rozumieć jako dodatkowe pola, niedostępne dla programisty:

struct { 	char a; 	char [3];        /* wyrównanie */ 	int  b; } S; 

Czasami wyrównanie pól struktury jest niepożądane, większość kompilatorów umożliwia programiście zmianę lub wyłączenie poprzez dyrektywę #pragma pack, np.:

#pragma pack(push)       /* zapamiętaj bieżącą wartość wyrównania */ #pragma pack(1)          /* brak wyrównania */ struct { 	char a;          /* sizeof(a) = 1 */ 	int  b;          /* sizeof(b) = 4 */ } S;                     /* sizeof(S) = 5 */ #pragma pack(pop) 

Zobacz też: unia

Struktura w języku C++[edytuj | edytuj kod]

Struktury w C++ są deklarowane tak jak w C, jednak oprócz pól mogą zawierać także funkcje (tzw. metody) i mogą dziedziczyć z innych klas i struktur.

Struktura różni się w C++ od klasy wyłącznie domniemanym zakresem widoczności jej pól i metod — dla klasy jest to private a dla struktur public. Używanie struktur zamiast klas nie jest jednak dobrą praktyką programowania, gdyż zaciemnia budowę programu. Inną odmianą struktury stosowaną w celu optymalizacji kodu jest unia.

 /* deklaracja */  struct miasto {      long ludnosc;      char* rzeka;      miasto(long ludnosc,char *rzeka): /*konstruktor*/      ludnosc(ludnosc), rzeka(strdup(rzeka)) {};      inline char* wez_rzeke() {return rzeka};      ~miasto() {free( (void*)rzeka );} /*destruktor*/  }; 

Struktura w Matlabie[edytuj | edytuj kod]

 % definicja  Poznan.ludnosc = 550000  Poznan.rzeka = 'Warta' 

Struktura w języku Fortran 90/95[edytuj | edytuj kod]

 ! deklaracja  TYPE::miasto    INTEGER(KIND=4)::ludnosc    CHARACTER(20)::rzeka  END TYPE miasto  ! definicja  TYPE(miasto)::Poznan  Poznan%ludnosc = 550000  Poznan%rzeka = 'Warta'  ! albo  Poznan = miasto(550000,'Warta') 

Struktura w Pascalu[edytuj | edytuj kod]

 {deklaracja}  TYPE miasto = RECORD      ludnosc : longint;      rzeka   : array[1..20] of char;  END;  {definicja}  VAR Poznan: miasto;  Poznan.ludnosc := 550000;  Poznan.rzeka := 'Warta'; 

Struktura w PL/1[edytuj | edytuj kod]

W języku PL/1 deklaracja struktury zawiera wprost podany przez programistę poziom zagłębienia w hierarchii struktury w postaci liczby całkowitej umieszczonej przed nazwą pola. Struktury na poziomie 1 to niezależne od siebie obiekty programowe, natomiast każdy kolejny poziom deklaruje pola lub kolejne podstruktury zawarte w strukturze nadrzędnej. Zdefiniowana hierarchia struktury może być użyta w innej deklaracji dzięki użyciu frazy LIKE, kopiującej zdefiniowaną strukturę.

  dcl   1 miasto,     2 ludnosc fixed dec(7,0),     2 rzeka char(20);   ...   miasto.ludnosc=550000;   miasto.rzeka='Warta'; 

Struktura w SML-u[edytuj | edytuj kod]

(* deklaracja typu rekordu (struktury) *) type miasto = {        ludnosc : int,        nazwa   : string,        rzeka   : string };  (* utworzenie zmiennej *) val Poznan = {nazwa="Poznań", rzeka="Warta", ludnosc=550000};  (* pobranie tylko jednego pola (wygodne przy przypisywaniu większej liczby pól niż jedno)    można podać albo nazwę zmiennej ('Ludnosc_zmiennej'),    albo przyjmowana jest nazwa taka sama nazwa jak pola ('rzeka') *) val {ludnosc = Ludnosc_Poznania, rzeka, ...} = Poznan;  (* pobranie tylko jednego pola *) val Ludnosc_Poznania = #ludnosc Poznan;