LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> 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 23241×

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

pridej.cz

 

DISKUZE

moc fajn serial 26.6.2008 09:18 ghibulo




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

14.11.2017 16:56 /František Kučera

Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tradičně první čtvrtek před třetím pátkem v měsíci: 16. listopadu od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).


Přidat komentář

12.11.2017 11:06 /Redakce Linuxsoft.cz
PR: 4. ročník odborné IT konference na téma Datová centra pro business proběhne již ve čtvrtek 23. listopadu 2017 v konferenčním centru Vavruška, v paláci Charitas, Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00. Konference o návrhu, budování, správě a efektivním využívání datových center nabídne odpovědi na aktuální a často řešené otázky, např Jaké jsou aktuální trendy v oblasti datových center a jak je využít pro vlastní prospěch? Jak zajistit pro firmu či jinou organizaci odpovídající služby datových center? Podle jakých kritérií vybrat dodavatele služeb? Jak volit součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně spravovat datové centrum? Jak eliminovat možná rizika? apod.
Přidat komentář

13.9.2017 8:00 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tentokrát netradičně v pondělí: 18. září od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

3.9.2017 20:45 /Redakce Linuxsoft.cz
PR: Dne 21. září 2017 proběhne v Praze konference "Mobilní řešení pro business". Hlavní tématy konference budou: nejnovější trendy v oblasti mobilních řešení pro firmy, efektivní využití mobilních zařízení, bezpečnostní rizika a řešení pro jejich omezení, správa mobilních zařízení ve firmách a další.
Přidat komentář

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

18.9.2017 14:37 / Rojas
high security vault

15.9.2017 7:33 / Wilson
new zealand childcare jobs

31.8.2017 12:11 / Jaromir Obr
Re: ukůládání dat ze souboru

30.7.2017 11:12 / Jaromir Obr
Národní znaky

27.7.2017 12:24 / Jaromir Obr
Cteni/zapis

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze