Hlavní strana -> Programování v C -> 12. Struktury, unie

12. Struktury, unie

Ano v tomto díle se budu zabývat strukturami a uniemi. Jsme už nějakou dobu v Evropské unii, tak by se hodilo o ní něco napsat ne? Ne ne ne, dělám si srandu, tu Evropskou přenechám někomu jinému. Já se budu zabývat uniemi v jazyce C.

Struktury

Tak pěkně popořadě a začnem těmi strukturami. Struktura je sdružený datový typ, který sdružuje k sobě určité proměnné, jež k sobě mají nějaký logický vztah. Obecně se struktury vytvářejí takto:

struct jméno-typu-struktury{
    typ proměnná1;
    typ proměnná2;
    typ proměnná3;
    .
    .
}jméno-struktury;

Kde jméno-typu-struktury je jméno struktury a představuje jakoby nový datový typ (představte si třebas float). Jméno-struktury je pak vlastní proměnnou (například f). Ve skutečnosti jsou jméno-typu-struktury i jméno-struktury nepovinné parametry. Pravděpodobě jste to nepochopili. Ukážu praktický příklad. Představte si třeba strukturu typu Clovek a vytvořím proměnné Pepa, Franta. Bude to vypadat takto, když jim zadám vlastnosti jako výška, hmotnost, věk.

struct Clovek{
    int vek, hmotnost;
    float vyska;
}Pepa, Franta;

Clovek je tedy typ struktury, který jsem si sám vytvořil, ale Pepa a Franta jsou samotnými proměnnými typu Clovek. Potom lze k jednotlivým prvkům struktury přistupovat přes tzv. tečkový operátor takhle.

Pepa.vek = 34;
Pepa.vyska = 1.83;
Franta.hmotnost = 87;
Franta.vek = 46;

Přiřazovat jdou rovnou celé struktury, pokud jsou stejného typu. (V našem případě Clovek.) Zadáme kompletní údaje třeba Pepovi a potom lze Frantovi dát ty samé vlastnosti jednoduše:

Franta = Pepa;

Struktury lze tedy velice pěkně využívat tam, kde je třeba pracovat s hodnotami, které mají mezi sebou nějakou spojitost. Třeba zaměstanci (plat, věk, jméno), body v prostoru (souřadnice x,y,z), automobily (značka, výrobce, cena, rok výroby). Dají se totiž jednoduše vytvářet jejich pole. Můžete si třeba udělat pole 15 zaměstnanců.

struct Zamestnanci{
    int plat, vek;
    char jmeno[40];
}pracovnik[15]; /* 1 tato struktura zabere v paměti 48 B */

Velikost struktury je obecně součtem velikostí jejích prvků, ale ve skutečnosti může být velikost struktury větší, protože překladače provádějí zarovnání v paměti pro rychlejší přístup. Proto byste měli vždy když potřebujete znát velikost struktury použít operátor sizeof(struktura)

K jednotlivým zaměstancům se pak dá jednoduše přistupovat indexací pole:

printf("Zadejte jmeno pracovnika");
gets(pracovnik[2].jmeno);
printf("Zadejte plat pracovnika.");
scanf("%d", &pracovnik[2].plat);

Tento krátký úsek programu požádá uživatele k zadání jména pracovníka (třetího), a jeho platu.

Možná už bych měl probrat ukazatele, asi to udělám v dalším díle, abyste lépe chápali, proč někde zadávám & a někde zase ne.

Unie

Nejdřív ale ještě dobereme látku dnešního dílu. Unie. Unie je celkem trefný název, protože jde vpodstatě o sdílenou paměť. Vytváří se podobně jako struktury takto:

union jméno-typu-unie{
    typ proměnná1;
    typ proměnná2;
    typ proměnná3;
    .
    .
}jméno-unie;

Podobně jako u struktur je jméno-typu-unie pouze nadefinováním jména pro daný typ unie a jméno-unie vytváří konkrétní proměnné. Rozdíl oproti strukturám je v uspořádání vnitřních proměnných v paměti. Zatímco u struktury se hezky řadí za sebe a velikost struktury je tedy součtem všech velikostí prvků struktury, pak u unie je její velikost dána největším prvkem. Pokud si vytvoříme strukturu ve které bude jedna proměnná typu char (1B), jedna int(4B) a jedna float(4B), bude velikost takovéto struktury 1 + 4 + 4 = 9B. V případě unie se stejnými prvky, bude její velikost 4B. Jednotlivé proměnné se tedy v paměti "kryjí". K čemu nám to může být? Pomocí unie se dá lehce přistupovat k jednotlivým bajtům některé proměnné. Můžeme to využít třeba k zakódování short int čísel tak, že prohodíme jejich bajty. Použijeme takovou unii.

union Unie{
    short int cislo;
    char bajt[2];
}crypt;

Velikost této unie je 2B, protože cislo a pole bajt se kryjí. Vložíme číslo do unie a pak prohodíme jeho bajty, abychom jeji zakódovali. K jednotlivým prvkům unie se přistupuje stejně jako u struktur přes tečkový operátor.

char pom; /* pomocná proměnná nutná k prohození bajtů */
crypt.cislo = 9654; /* vložení čísla k zakódování */

pom = crypt.bajt[0];             /* vlastní */
crypt.bajt[0] = crypt.bajt[1];   /* zakódování */
crypt.bajt[1] = pom;             /* čísla */

Zpětné dekódování se provede stejným způsobem. Využití unií i struktur je velmi široké a je jenom na vás jak s nimi budete zacházet. Příště udělám ty ukazatele a pak přidám nějaké příklady, protože už je budete potřebovat více než jenom další teorii. Zatím. K

Zpět

Programování v C | CZ 175/477 | Mapa stránek
Bc. Petr Klimánek, student Ostravské univerzity v Ostravě