Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Učíme se C (26. díl) - Datové typy enum a union
10. července 2001, 00.00 | Vlastnosti datových typů enum a union, jejich definice, použití a
na co si dát při práci s nimi pozor.
Výčtový datový typ enum
Jedním z datových typů, o kterých jsme zatím nemluvili, je typ enum. Jedná se vlastně o jakousi náhradu za symbolické konstanty vytvářené pomocí makra #define. Uživatel si pro nový výčtový typ sám definuje množinu přípustných hodnot uvedením všech jejich prvků. Není tedy problém vytvořit si pomocí enum nový typ, jež může nabývat například hodnot CERVENA, MODRA, ZELENA.
Vnitřně jsou pak tyto konstanty reprezentovány celými čísly, a to nejmenšího znaménkového typu, který je schopen všechny prvky nového typu obsáhnout. V našem případě postačí typ char, který pro reprezentaci tří symbolických konstant bohatě postačí.
Definice proměnných typu enum
Definice proměnné typu enum je velice podobná definicím struktur. Jistě si vzpomínáte, že proměnné struktury jsme mohli definovat více způsoby. To platí i pro typ enum.
My si ukážeme variantu s použitím typedef, která je pro definici asi nejvhodnější. Jediný rozdíl oproti definici struktury je ten, že místo klíčového slova struct použijeme slovo enum a že ve složených závorkách, kde jsme dříve definovali jednotlivé prvky struktury, teď prostě uvedeme seznam všech symbolických konstant oddělených čárkou. V našem případě tedy:
|
Nyní jsme tedy nedefinovaly nový výčtový typ barvy. Teď už stačí jen vytvořit proměnnou tohoto typu.
barvy barva1;
Nově vytvořená proměnná barva1 teď může nabývat hodnoty CERVENA, MODRA nebo ZELENA, jak si ale ukážeme, může to být složitější. Navíc, takto zavedené symbolické konstanty jsou v programu použitelné i bez nutnosti vytvářet proměnnou. Pokud bychom chtěli vytvořit symbolické konstanty TRUE a FALSE, můžeme je buď nadefinovat pomocí makra:
#define FALSE 0
#define TRUE 1
nebo prostě jen vytvořit nový typ:
enum { FALSE, TRUE };
Řekli jsme si, že vnitřně jsou hodnoty výčtových typů reprezentovány celými čísly. V praxi to vypadá tak, že každé symbolické konstantě v definici výčtového typu je přiřazena některá číselná konstanta podle pořadí v seznamu. V našem případě je konstanta CERVENA == 0, MODRA == 1 a ZELENA == 2. Důsledkem je, že výčtové a celočíselné typy jsou navzájem kompatibilní a lze tedy bez problémů použít následující zápisy:
|
Poněkud nepříjemné je, že lze do proměnné výčtového typu přiřadit i celočíselnou hodnotu, která nemá definovanou odpovídající symbolickou konstantu. Vlastně tak přiřadíme hodnotu, která patří mimo rozsah typu, přitom však není hlášena žádná chyba při překladu ani za běhu programu:
|
Aby to bylo ještě složitější, lze při definici výčtového typu i přímo určit číselnou reprezentaci konstant. Platí pravidlo, že číselná hodnota symbolické konstanty je číslo o 1 větší než hodnota předchozí symb. konstanty v seznamu, přičemž hodnota první položky je rovna 0, není-li uvedeno jinak. Samotné nastavení provedeme prostým přiřazením číselné konstanty, jak je to ukázáno v následujícím příkladu:
|
První položka v seznamu - PONDELI - bude reprezentována jako -1. UTERY bude číslo o 1 vyšší, tedy 0, a stejně tak STREDA, které se přiřadí hodnota 1. CTVRTEK a PATEK jsou dány pevně a zbylé konstanty budou reprezentovány jako SOBOTA==10 a NEDELE==11. Všimněte si, že položky CTVRTEK a SOBOTA jsou reprezentovány stejným číslem 10, což je při definici výčtového typu bez problémů možné.
Datový typ union
Druhým datovým typem, o kterém dnes bude řeč, je union. Tento typ je jistou obdobou variantních záznamů známých např. z pascalu. Union si lze jednoduše představit jako obyčejnou strukturu, kde ale všechny její položky sdílejí jedno paměťové místo, tedy se překrývají (jsou na stejné adrese). Zatímco u obyčejných struktur bylo pro každou položku alokováno zvláštní místo v paměti, v případě unionů je tedy alokováno místo pouze pro největší z nich.
Definice unionů je prakticky shodná s definicí struktur:
|
|
Obsah seriálu (více o seriálu):
- Učíme se C (1. díl)
- Učíme se C (2. díl)
- Učíme se C (3.díl)
- Učíme se C (4. díl)
- Učíme se C (5.díl)
- Učíme se C (6.díl)
- Učíme se C (7.díl)
- Učíme se C (8.díl)
- Učíme se C (9.díl) - Řetězce
- Učíme se C (10.díl) - Vstupně výstupní funkce
- Učíme se C (11.díl) - Formátovaný výstup
- Učíme se C (12.díl) - Formátový specifikátor
- Učíme se C (13.díl)
- Učíme se C (14.díl) - Vícerozměrná pole
- Učíme se C (15.díl) - Ukazatele
- Učíme se C (16.díl) - Modifikátory paměťové třídy
- Učíme se C (17.díl) - Pole a ukazatel
- Učíme se C (18. díl) - Dynamická alokace paměti
- Učíme se C (19. díl) - Práce se soubory I.
- Učíme se C (20. díl) - Práce se soubory II.
- Učíme se C (21. díl) - Parametry funkce main()
- Učíme se C (22. díl) - Ukazatele na funkce
- Učíme se C (23. díl) - Složité deklarace a definice
- Učíme se C (24. díl) - Funkce s proměnným počtem parametrů
- Učíme se C (25. díl) - Bitové operátory a bitové pole
- Učíme se C (26. díl) - Datové typy enum a union
- Učíme se C (27. díl - závěr) - Programové moduly
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007