For faster navigation, this Iframe is preloading the Wikiwand page for Struktura (programowanie).

Struktura (programowanie)

Z Wikipedii, wolnej encyklopedii

Ten artykuł od 2022-04 wymaga zweryfikowania podanych informacji.Należy podać wiarygodne źródła, najlepiej w formie przypisów bibliograficznych.Część lub nawet wszystkie informacje w artykule mogą być nieprawdziwe. Jako pozbawione źródeł mogą zostać zakwestionowane i usunięte. Po wyeliminowaniu niedoskonałości należy usunąć szablon ((Dopracować)) z tego artykułu.

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

 /* 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

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++

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

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

Struktura w języku Fortran 90/95

 ! 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

 {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

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

(* 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;
{{bottomLinkPreText}} {{bottomLinkText}}
Struktura (programowanie)
Listen to this article

This browser is not supported by Wikiwand :(
Wikiwand requires a browser with modern capabilities in order to provide you with the best reading experience.
Please download and use one of the following browsers:

This article was just edited, click to reload
This article has been deleted on Wikipedia (Why?)

Back to homepage

Please click Add in the dialog above
Please click Allow in the top-left corner,
then click Install Now in the dialog
Please click Open in the download dialog,
then click Install
Please click the "Downloads" icon in the Safari toolbar, open the first download in the list,
then click Install
{{::$root.activation.text}}

Install Wikiwand

Install on Chrome Install on Firefox
Don't forget to rate us

Tell your friends about Wikiwand!

Gmail Facebook Twitter Link

Enjoying Wikiwand?

Tell your friends and spread the love:
Share on Gmail Share on Facebook Share on Twitter Share on Buffer

Our magic isn't perfect

You can help our automatic cover photo selection by reporting an unsuitable photo.

This photo is visually disturbing This photo is not a good choice

Thank you for helping!


Your input will affect cover photo selection, along with input from other users.