C/C++ (30) - Výčtový typ a nestandardní knihovny
První polovinu našeho seriálu, která se věnuje čistému C, ukončíme výčtovým typem a stručným návodem, kde v těch nejčastějších případech hledat funkčnost, když nám standardní knihovna nepomůže.
28.12.2005 06:00 |
Jan Němec
| Články autora
| přečteno 27480×
Výčtový typ
Poslední, co nám zbývá probrat ze základní syntaxe, je výčtový typ. V C se
používá málo, neboť lze snadno nahradit symbolickými konstantami preprocesoru.
O něco běžnější je užití v C++, kde je mezi programátory rozšířenější určitá
snaha vyhýbat se v rámci možností řešením založeným na preprocesoru.
Programátor občas potřebuje pracovat s nějakou předem pevně danou malou
nečíselnou množinou hodnot, které mají přirozenou reprezentaci pomocí krátkého
textu. Může jít například o příkazy nějakého protokolu, boolovské hodnoty nebo
třeba města, ve kterých firma provádí školení.
Hodnoty můžeme reprezentovat přímo řetězcem, jež je vystihuje. Je to sice
názorné, ale ne příliš efektivní. Navíc na řetězce nejde použít switch
a větvení podle hodnoty musíme implementovat pomocí if a strcmp.
if (!strcmp(mesto, "Praha")) {
puts("Školit bude Karel.");
} else if (!strcmp(mesto, "Brno")) {
puts("Školit bude Alois.");
} else if (!strcmp(mesto, "Ostrava")) {
puts("Školit bude Jacek.");
}
Efektivní, ale nikoli názorné je použití číselných konstant pro jednotlivá
města.
switch (mesto) {
case 0: puts("Školit bude Karel."); break;
case 1: puts("Školit bude Alois."); break;
case 2: puts("Školit bude Jacek."); break;
}
Velkým problémem tohoto řešení je jeho nečitelnost. Programátor, který se
vrátí k projektu po nějakém čase, nebo nový kolega z týmu nebudou vědět, které
číslo patří ke kterému městu. Jde o vážnější problém, než si většina
programátorů - začátečníků uvědomuje.
Řešením je samozřejmě preprocesor. Níže uvedený kód pochopí i nový kolega
již na první pohled.
#define PRAHA 0
#define BRNO 1
#define OSTRAVA 2
/* ... */
switch (mesto) {
case PRAHA: puts("Školit bude Karel."); break;
case BRNO: puts("Školit bude Alois."); break;
case OSTRAVA: puts("Školit bude Jacek."); break;
}
Preprocesor ovšem řada programátorů považuje za principiálně špatný nástroj (například v Javě,
která základní syntaxí z C a C++ vychází, vůbec není). Jedná se částečně o
ideologickou zaslepenost, neboť preprocesor je velmi užitečný, nicméně je
pravda, že v C se běžně řeší pomocí preprocesoru i věci, které by bylo lepší
řešit jinak.
Náš příklad jde uspokojivě napsat i bez preprocesoru, právě díky výčtovému
typu.
typedef enum {
PRAHA, BRNO, OSTRAVA
} MESTA;
MESTA mesto;
/* ... */
switch (mesto) {
case PRAHA: puts("Školit bude Karel."); break;
case BRNO: puts("Školit bude Alois."); break;
case OSTRAVA: puts("Školit bude Jacek."); break;
}
C reprezentuje výčtový typ jako celé číslo a umožňuje jeho konverzi na int.
Pokud nezadáme číselné hodnoty jednotlivých konstant explicitně, ohodnotí
je C implicitně jako 0, 1, 2, ... podle pořadí v jakém jsou uvedeny.
Výše uvedená definice tak je zcela ekvivalentní té následující.
typedef enum {
PRAHA = 0,
BRNO = 1,
OSTRAVA = 2
} MESTA;
Nic nám samozřejmě nebrání dát konstantám jiné hodnoty. Občas se hodí číselnou
hodnotu vytisknout.
MESTA mesto;
mesto = BRNO;
printf("%i", (int) BRNO);
/* Vypíše text "1" */
O něco více by se nám hodil výpis textové reprezentace hodnoty, ale tady nám
C moc nepomůže a musíme si pomoci sami. Například pomocí switch, což je poněkud
neohrabané nebo (pokud jsou konstanty ohodnocené přirozenými čísly od nuly)
lépe přes pole řetězců. Ukážeme si to na kompletním příkladu.
#include <stdio.h>
/* Definice typu */
typedef enum {
PRAHA, BRNO, OSTRAVA
} MESTA;
#define POCET_MEST 3
/* Názvy typu */
const char *jmena[POCET_MEST] = {"Praha", "Brno", "Ostrava"};
const char *nazevMesta(MESTA m) {
int index = (int) m;
if (index < 0 || index >= POCET_MEST) {
/* Například neinicializovaná hodnota. */
return "Nesmysl, ale nemusíme kvůli tomu spadnout";
}
return jmena[index];
}
const char *kdoSkoli(MESTA mesto) {
switch (mesto) {
case PRAHA: return("Školit bude Karel.");
case BRNO: return("Školit bude Alois.");
case OSTRAVA: return("Školit bude Jacek.");
}
}
int main(void) {
MESTA mesto;
mesto = OSTRAVA;
printf("%s. %s\n", nazevMesta(mesto), kdoSkoli(mesto));
return 0;
}
Co není ve standardní knihovně
Standardní knihovna jazyka C obsahuje jen to, co bylo během jejího vzniku
a standardizace považováno za přenositelné a užitečné. S její pomocí jistě
můžeme napsat program, který načte obrázek, uložený v lokálním souborovém
systému, převede ho z formátu gif do formátu jpg a uloží opět do lokálního
souborového systému. Pokud však chceme zobrazit okno v nějakém GUI, načíst
obrázek v samostatném vláknu (aby načítání neblokovalo zpracování zpráv pro
okno) z webu a vlákna synchronizovat, zobrazit jej v okně a poté jej externím
programem zabalit do nově vytvořeného adresáře jako obrazek.gif.gz, standardní
knihovna nám nepomůže ani s jednou z důležitých akcí. Proto je běžné používat
i nestandardní knihovny. Ztrácíme tím bohužel přenositelnost. Velmi často je
třeba při přechodu mezi platformami pro stejné akce volat odlišné
funkce z odlišných knihoven. Ve většině případů bude potom program na úrovni
zdrojových kódů přenositelný pouze mezi jednotlivými unixovými systémy nebo
mezi jednotlivými verzemi Windows od 95 výše a podobně. Projdeme si ve
stručnosti nejdůležitější knihovny.
OS unixového typu včetně Linuxu
Na unixovém operačním systému neexistuje nějaká univerzální knihovna, která
by doplnila chybějící funkčnost té standardní. Funkce jsou rozptýleny
do velkého množství knihoven, každou spravuje někdo jiný. Doporučil bych
hledat informace na www stránkách konkrétní knihovny, zkusit najít nějaký
tutoriál, porozhlédnout se po českých linuxových serverech jako je například
linuxsoft.cz,
root.cz,
abclinuxu.cz
nebo docs.linux.cz.
Pokud znáte jméno konkrétní funkce, zkuste se podívat na manuálové stránky.
Grafické prostředí v XWindows
Program sice může pomocí Xlib komunikovat přímo s X serverem, ale dnes již
téměř nikdo takhle programy nepíše. V běžných případech je mnohem lepší
použít nějakou nadstavbu - toolkit. Nejčastěji se používá Qt (třeba v KDE)
nebo GTK+ (třeba v Gnome). Vzhledem k tomu, že Qt a rovněž téměř všechny méně
významné GUI knihovny jsou napsané v C++, zbývá nám pouze GTK+, které je
napsané v C. Dokumentaci najdete
na stránkách projektu a hezký tutoriál na
rootovi.
To, co umí shell, a mnoho dalšího
Pokud chcete spouštět procesy, vytvářet roury, přesměrovávat standardní výstup
a podobně, zamiřte na dokumentaci glibc.
Práce se sockety
Chystáte-li se napsat vlastní web server nebo nový prohlížeč, doporučil bych
vám jeden tutoriál, který začal na builder.cz a skončil na rootu.
Vlákna
Použití vláken v programu můžete nastudovat například
v tomto tutoriálu.
Šifrování
Pokud chcete šifrovat, zabezpečit komunikaci po socketu před nepřítelem nebo
třeba jen používat velká čísla, vřele doporučuji
OpenSSL.
MS Windows 95 a vyšší
Funkce, které programátor nejčastěji potřebuje od vytváření oken až po
synchronizaci procesů, poskytuje přímo API operačního
systému. Dokumentaci k jednotlivým funkcím najdete na stránkách
MSDN u Microsoftu. Programátoři
bez pevného připojení k Internetu, kterým nevadí starší formát a obsah
si mohou najít soubor win32.hlp, pro
začátečníka je jako dokumentace určitě dostačující. Nejlepší je začít nějakým
tutoriálem. Docela hezký a česky psaný věnovaný především GUI je na stránkách
builder.cz. I pod Windows ovšem platí, že
většina programátorů píše GUI v C++ a za použití nějaké vyšší knihovny,
nicméně narozdíl od X Windows považuji zejména pro malé projekty přímé volání
Win32 API a čisté C za celkem snesitelné technologie.
Pokračování příště
Dnešním dílem jsme dokončili povídání o C, příště se již dostaneme k C++.
Začneme stručnou historií jazyka, příčinami vzniku a jeho základní charakteristikou.
Verze pro tisk
|
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|

Vyhledávání software

Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|