Výčtový typ
Výčtový typ (enum) je v podstatě seznam symbolických konstant, který definuje všechny možné hodnoty, jichž může proměnná tohoto typu nabývat.
Jedná se o pojmenování celočíselných hodnot. Vnitřně jsou konstanty reprezentovány celými čísly. Výčtový typ enum definujeme podobně jako u struktury nejčastěji jako uživatelský datový typ (typedef).
Výčtový typ používáme proto, abychom si nemuseli pamatovat např. různé číselné hodnoty. Když si tyto hodnoty pojmenujeme, jsou pro nás lépe zapamatovatelné.
Definice výčtového typu - příklad:
typedef enum{
CERVENA,
CERNA,
MODRA,
ZELENA
} Tbarvy;
- definuje datový typ Tbarvy s hodnotami CERVENA, CERNA, MODRA, ZELENA. Ř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. Hodnoty se číslují od nuly, takže CERVENA ma hodnotu 0, CERNA má hodnotu 1 atd.
Konstanty nemusíme vždy číslovat automaticky, můžeme jim při jejich definici přiřadit libovolné, námi požadované číselné hodnoty.
//ukázka kódu
Tbarvy barva1;
barva1 = MODRA;
if (barva1 == MODRA) printf("barva je modrá a má hodnotu %d\n", MODRA);
- deklaruje proměnnou barva1, která může nabývat výše vyjmenované hodnoty (CERVENA, CERNA, MODRA, ZELENA - nejedná se o textovou hodnotu, jenom o název odpovídajícího čísla). Ty jsou zároveň reprezentovány celočíselnými hodnotami 0,1,2,3. Proměnná barva1 je nastavená na hodnotu MODRA.
//pouziti vyctu bez typedef
enum mesic {
leden = 1, unor, brezen, duben, kveten, cerven, cervenec, srpen, zari,
rijen, listopad, prosinec} x;
enum mesic dalsi_mesic;
V předchozím kódu je vidět, jak můžeme změnit "číslování" ve výčtovém typu. První nebude 0, ale nastavili jsme leden na hodnotu 1. Další hodnoty budou vždy o 1 větší než předchozí. Navíc jsme nedefinovali datový typ pro výčet. Deklarovali jsme potom 2 proměnné (x, dalsi_mesic) pro daný výčet.
V jazyce C můžeme zaměnit hodnotu výčtového typu odpovídající celočíselnou hodnotou. Jazyk C++ je přísnější, vyžaduje vždy jenom hodnotu uvedenou při definici výčtového typu.
Typ union
Definice typu union - příklad:
typedef union{
char znak;
int icislo;
double dcislo;
} Tunie;
Definice pro union je už na první pohled velmi podobná strukturám. Je tam ale jeden podstatný rozdíl. Z položek unie lze používat v jednom okamžiku pouze jednu. Ostatní mají nedefinovanou hodnotu. Realizace je jednoduchá. Paměťové místo, vyhrazené pro unii je tak veliké, aby obsáhlo jedinou (paměťově největší) položku. Je na programátorovi, aby pracoval s prvkem unie správným způsobem a aby si hlídal, co v dané chvíli vlastně unie obsahuje.
Bitové pole
Bitové pole je datový objekt podobný typu struct, kde pro každou položku definujeme i její velikost v bitech, což lze využít například potřebujeme-li šetřit pamětí. Nicméně je nutné si uvědomit, že celková velikost bude vždy zarovnána na násobek sizeof(int). Typy položek bitového pole jsou omezeny pouze na typ int (signed i unsigned) a velikost každé z nich nesmí překročit počet bitů alokovaných typem int.
Definice bitového pole - příklad:
typedef struct{
unsigned int pohlavi : 1;
unsigned int vaha : 8;
unsigned int vek : 7;
} Tclovek;
Deklarace bitového pole je v podstatě totožná s deklarací obyčejné struktury, pouze přibude informace o počtu bitů obsazených jednotlivými jeho položkami. Ani přístup k položkám nebude v případě bitového pole odlišný od způsobů používaných při práci s typem struct.