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;