Struktura (programowanie) - Google

Struktura (programowanie)

Z Wikipedii

Skocz do: nawigacji, szukaj

Struktura - typ danych w języku programowania.

Struktura jest typem zawierającym w sobie zmienne dowolnego typu (tzw. pola); jest uogólnieniem krotki - pola nie są dostępne przez indeks, lecz nazwę.

Struktura umożliwia zapakowanie powiązanych ze sobą logicznie danych w jednym obszarze pamięci, który może być przesyłany jako jeden argument.

Spis treści

[edytuj] Struktura w języku C

 /* deklaracja */
 struct miasto {
     long ludnosc;
     char* rzeka;
 };                         
 
 /* definicja */
 struct miasto Poznan;
 Poznan.ludnosc = 600000;
 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.

[edytuj] 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 po 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

[edytuj] 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.

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

[edytuj] Struktura w Matlabie

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

[edytuj] 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 = 6000000
 Poznan%rzeka = 'Warta'
 ! albo
 Poznan = miasto(6000000,'Warta')

[edytuj] Struktura w Pascalu

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

[edytuj] 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=6000;
  miasto.rzeka='Warta';

[edytuj] 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=600000};

(* 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;

TVP 2 szuka miejsca dla Pospieszalskiego
TVP 2 szuka dla programu publicystycznego Jana Pospieszalskiego "Warto rozmawiać" nowego miejsca w ramówce.
HBO promuje serial w mediach
Do 25 listopada br. potrwa kampania reklamowa kanału HBO, promująca serial "Generation kill: czas wolny".
Przychody Gadu-Gadu wzrosły prawie o połowę
Przychody Gadu-Gadu SA, właściciela komunikatora internetowego o tej samej nazwie, po trzech kwartałach br. wyniosły 21,5 mln zł i były o 49,61 proc. większe, niż w tym samym okresie ub.r. – poinformowała wczoraj spółka w komunikacie.
Miesięczniki dla rodziców sprzedają się lepiej
W sierpniu br. trzy tytuły spośród miesięczników dla rodziców sprzedawały się lepiej, niż w tym miesiącu rok temu – wynika z danych Związku Kontroli Dystrybucji Prasy o rozpowszechnianiu płatnym razem.
"Süddeutsche Zeitung" tnie koszty
Grupa medialna Südwestdeutsche Medienholding (SWMH), właściciel niemieckiego dziennika "Süddeutsche Zeitung", wprowadza plan oszczędnościowy.
Linki: Strona gwna