Cyklus for for( for(;;)
// nekoneˇ cn´ y cyklus
for(int i=0; i
IJC — Jazyk C
92/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
´ ı Pˇr´ıkazy – pokraˇcovan´ Pˇr´ıklad: ˇrazen´ı vzestupneˇ (shell-sort) /* funkce ˇ rad´ ı pole v[] o rozmˇ eru n vzestupnˇ e */ void shell(int v[], int n) { int gap, i, j, temp; for( gap=n/2; gap>0; gap/=2) for( i=gap; i
93/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
´ ı Pˇr´ıkazy – pokraˇcovan´ ´ ´ Operator cˇ arka – postupne´ vyhodnocen´ı v´yrazu, ˚ pouˇzit´ı posledn´ıho ´ ˇ Pˇr´ıklad: obracen´ ı ˇretezce na m´ısteˇ void reverse(char s[]) { int i, j; for( i=0, j=strlen(s)-1; i<j; i++, j--) { int c = s[i]; s[i] = s[j]; s[j] = c; } } ´ ˇ ıc´ı argumenty funkc´ı nejsou ´ Poznamka: cˇ arky oddeluj´ ´ operatory! IJC — Jazyk C
94/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
´ ı Pˇr´ıkazy – pokraˇcovan´ Cyklus do-while do pˇ r´ ıkaz while( v´ yraz );
// cykl´ ı dokud podm´ ınka plat´ ı
´ Poznamky: Provede se alesponˇ jednou Podle statistik cca 5% cyklu˚ ´ poˇrad´ı Pˇr´ıklad: konverze cˇ ´ısla na znaky v opaˇcnem do { s[i++] = n % 10 + ’0’; }while( (n/=10) > 0 ); IJC — Jazyk C
95/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
Pˇr´ıkaz break Ukonˇcuje nejbl´ızˇ e nadˇrazen´y pˇr´ıkaz switch, while, for, nebo do-while ´ ı koncov´ych mezer a tabulator ´ u˚ Pˇr´ıklad: vynechan´ int main() { int n; char line[MAXLINE]; while( (n=getline(line,MAXLINE)) > 0 ) while( --n >= 0 ) if( !isspace(line[n]) ) break; line[n+1] = ’\0’; printf("%s\n", line); } return 0; } IJC — Jazyk C
{
96/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
Pˇr´ıkaz continue
ˇ cyklu a pokraˇcuje podm´ınkou cyklu Pˇreskoˇc´ı zbytek tela for( i=0; i
ˇ cyklu ´ Poznamka: Eliminace zanoˇren´ı tela
IJC — Jazyk C
97/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
´ eˇ ˇ st´ı Pˇr´ıkaz goto a nav ´ Pouˇzitelne´ pouze v ramci jedne´ funkce void f() { // .... goto identifik´ ator; // .... identifik´ ator : pˇ r´ ıkaz; // .... } ´ Poznamky: ˇ minimalizovat pouˇzit´ı Pouˇz´ıvat opatrne, ´ Nikdy neskakat do strukturovan´ych pˇr´ıkazu˚
IJC — Jazyk C
98/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
Pˇr´ıklad – prakticke´ pouˇzit´ı skoku int f() { for (....) for (....) { // 2. ´ uroveˇ n // .... if (chyba) goto error; // .... } return kladny_vysledek; error: // oˇ setˇ ren´ ı chyby return -1; }
IJC — Jazyk C
99/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
Funkce typ jm´ eno ( deklarace_parametr˚ u ) { deklarace lok´ aln´ ıch promˇ enn´ ych pˇ r´ ıkazy // C99: i deklarace } Funkce muˇ ˚ ze vracet struktury, unie ale ne pole Pˇr´ıkaz return return; /* u funkce void f() */ return e; /* e=v´ yraz kompatibiln´ ı s typem fce */ ´ Poznamky: C99+: inline funkce, C11: _Noreturn IJC — Jazyk C
100/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
Rekurze viz Rekurze. ´ Pˇr´ıklad: v´ypis celeho cˇ ´ısla des´ıtkoveˇ void printd(int n) { int i; if(n<0) { putchar(’-’); n = -n; } if((i=n/10) != 0) printd(i); // rekurze putchar(n%10 + ’0’); } ´ Poznamka: tail recursion IJC — Jazyk C
101/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
Argumenty funkc´ı
´ any ´ hodnotou jsou pˇredav ´ ı odkazem (ukazatel na prvn´ı prvek) pole se pˇredavaj´ ´ ˇ ym poˇctem argumentu˚ problemy s funkcemi s promenn´ C99: __func__, ... ´ Poznamka: API, ABI
IJC — Jazyk C
102/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
´ ı Argumenty funkc´ı – pokraˇcovan´ ˇ ym ˇ Funkce s promenn ´ poctem argumentu˚ typ f(typ1 parametr1, ... ); // variadic function Mus´ı b´yt alesponˇ jeden pevn´y parametr ´ poˇctu argumentu˚ Funkce mus´ı m´ıt informace o skuteˇcnem ´ ı pˇri zavolan´ va_list, va_start(), va_arg(), va_end() ˇ ym poˇctem argumentu˚ Pˇr´ıklad: Standardn´ı funkce s promenn´ int printf(const char *fmt, ... ); int sprintf(char *s, const char *fmt, ... ); IJC — Jazyk C
103/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
ˇ e´ Extern´ı promenn ´ ıch promenn´ ˇ ych a funkc´ı Program = mnoˇzina globaln´ ´ ı promenn ˇ e´ Globaln´ ˇ e´ Jsou to staticke´ promenn Inicializace ”pˇri pˇrekladu” (Pouˇzit´ı napˇr. pro omezen´ı poˇctu argumentu˚ funkc´ı) ´ Deklarace funkce je implicitneˇ extern´ı (extern je zbyteˇcne): extern int plus(int,int);
int plus(int,int);
ˇ ych je podstatn´y rozd´ıl: U promenn´ extern int a;
int a; // definice
Pouˇzit´ı: extern deklarace pˇred pouˇzit´ım, modularita ´ Poznamka: C89: nedeklarovane´ funkce: extern int f(); IJC — Jazyk C
104/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
Rozsah platnosti
(scope) ´ ´ je jmeno ´ Usek programu, ve kterem definovane´ ˇ e´ blok automaticke´ promenn ´ ı promenn ˇ e´ globaln´ od deklarace do konce souboru ´ jmena parametru˚ prototyp, funkce ´ eˇ ˇ st´ı nav funkce
IJC — Jazyk C
105/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
ˇ e´ Staticke´ promenn existuj´ı trvale bez ohledu na aktivaci funkc´ı ˇ a´ nebo funkce oznaˇcena´ static je platna´ Pozor: promenn ´ pouze v ramci souboru (modulu) a nen´ı viditelna´ z jin´ych modulu˚ Pˇr´ıklad: int count; static char buffer[100]; static int plus(int a, int b) { static int s = 1; int n = a + buffer[b]; return s = (n + count*s); } IJC — Jazyk C
// statick´ a a extern´ ı // statick´ a a ne-extern´ ı // statick´ a=ne-extern´ ı // statick´ a a lok´ aln´ ı // automatick´ a=lok´ aln´ ı
106/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
ˇ e´ register Promenn ´ jsou uloˇzeny v registru procesoru Pokud je to moˇzne, (rychlost) ˇ e´ Pouze pro automaticke´ promenn ˇ Nelze z´ıskat ukazatel na registrovou promennou Pˇr´ıklad: int swap(int *x, int *y) { register int tmp = *x; *x = *y; *y = tmp; }
IJC — Jazyk C
107/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
Blokova´ struktura programu ´ urovn ˇ Hierarchie bloku˚ (zanoˇren´ı do ”libovolne” e) ´ ˇ e´ V bloku lze deklarovat promenn ´ ı deklarace pˇrekr´yva´ ostatn´ı (globaln´ ´ ı i lokaln´ ´ ı), plat´ı Lokaln´ ´ ´ ıch parametru˚ to i pro jmena formaln´ ´ Poznamky: Nelze vnoˇrovat definice funkc´ı ´ Makra nerespektuj´ı tuto strukturu (nejsou ”hygienicka”)
IJC — Jazyk C
108/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
ˇ ych Inicializace promenn´ ´ Staticke´ jsou (”pˇri pˇrekladu”) implicitneˇ inicializovany ˇ hodnotou nula, pˇr´ıpadna´ inicializace probehne pˇri pˇrekladu (vyˇzaduje konstantn´ı v´yraz) const int nula; static int dva = 2; void f(int p) { static bool stav=true; // mus´ ı b´ yt konstanta // .... } Automaticke´ a registrove´ maj´ı nedefinovanou hodnotu, ˇ pˇr´ıpadna´ inicializace se provede pˇri behu programu void g(int v[], int n) { int x; // nedefinovan´ a hodnota int high = v[n-1]; // nemus´ ı b´ yt konst. v´ yraz // .... } IJC — Jazyk C
109/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
ˇ ych Pˇr´ıklady inicializace strukturovan´ych promenn´ Inicializace pol´ı int pole1[] = { 1, 1, 1, 0, 0, }; int pole2[10] = { 1, [5]=0, 1, }; // jen C99+ char string1[] = "the"; // pouˇ zit´ ı ˇ retˇ ezce char string2[] = { ’t’, ’h’, ’e’, ’\0’ }; char nonstring[3] = "the";
// nen´ ı ˇ retˇ ezec!
Inicializace struktur struct MyExtraComplex { double Re; int Im; } c1 = { .Re=1.25, .Im=3 }; // C99 inicializace IJC — Jazyk C
110/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
Pˇrekladove´ jednotky (moduly) Modul je samostatna´ pˇrekladova´ jednotka – soubor *.c Pˇr´ıklad:
´ styl – hroz´ı nekonzistence pozor, NEVHODNY
// === modul1.c === // === modul2.c === int x; // definice x extern int x; // deklarace x static int s; static int s; void f2(double d); int main() { f2(5); s--; return 0; }
static void f(void) { s++; } void f2(double d) { x = 10*d; f(); }
Pˇreklad a sestaven´ı v´ıce modulu: ˚ cc modul1.c modul2.c IJC — Jazyk C
111/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
´ e´ ˇreˇsen´ı Pˇrekladove´ jednotky – spravn ˇ ı rozhran´ı v souboru *.h (header file). Moduly zveˇrejnuj´ V rozhran´ı jsou pouze: ˇ ych deklarace promenn´ deklarace funkc´ı definice typu˚ definice maker definice inline funkc´ı
(Jen pokud jsou sd´ılene´ v´ıce moduly.) ´ a´ (#include) do modulu, Rozhran´ı se vklad ˚ aby byla pˇri ˇ pˇrekladu zajiˇstena konzistence deklarac´ı a kontrola definic. ´ Poznamka: Aby to opravdu fungovalo, potˇrebujete ´ eˇ pouˇz´ıt program ”make”nebo podobn´y. spravn
IJC — Jazyk C
112/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
´ e´ ˇreˇsen´ı 2 Pˇrekladove´ jednotky – spravn // === rozhrani.h === extern int x; void f2(double d); // === modul1.c === #include "rozhrani.h" static int s; int x; /* definice */ int main() { f2(5); s--; return 0; }
IJC — Jazyk C
// === modul2.c === #include "rozhrani.h" static int s; static void f(void) { s++; } void f2(double d) { x = 10*d; f(); } 113/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
Preprocesor jazyka C Direktivy zaˇc´ınaj´ı znakem # v prvn´ım sloupci Vloˇzen´ı souboru s rozhran´ım #include <stdio.h> #include "modul2.h"
// hled´ a i v ./
Definice makra bez parametru˚ #define JMENO
text \ text na dalˇ s´ ım ˇ r´ adku // ... kaˇ zd´ y v´ yskyt JMENO se rozvine na text #undef JMENO Pˇr´ıklad: #define EOF -1 #define NULL ((void*)0) IJC — Jazyk C
114/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
Makra s parametry Pˇr´ıklad: pozor na priority a vedlejˇs´ı efekty #define SQR(a) ((a)*(a)) // pouˇ zit´ ı: x = SQR(p+q); // ((p+q)*(p+q)) O.K. x = SQR(i++); // ((i++)*(i++)) nedefinov´ ano #define ABS(a)
( ((a)<0) ? -(a) : (a) )
#define PRIKAZ(x) do { neco(x); } while(0) //.... if(a) PRIKAZ(a); else PRIKAZ(b);
IJC — Jazyk C
115/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
ˇ y pˇreklad Podm´ınen´ ´ ı usek Vynechan´ u˚ programu ´ #ifdef JMENO ..... #endif /* JMENO */
#ifndef JMENO ..... #endif /* !JMENO */
#if konstantn´ ı_v´ yraz ..... #elif konstantn´ ı_v´ yraz ..... #else ..... #endif V podm´ınce jsou pouˇzitelne´ pouze konstantn´ı v´yrazy: defined(linux) && defined(i386) __BORLANDC__ >= 0x0300 IJC — Jazyk C
116/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
´ ı parametru˚ a vytvaˇ ´ ren´ı ˇretezc ˇ u˚ Spojovan´
# ##
ˇ vytvoˇren´ı ˇretezce (”stringize”) ´ u˚ spojen´ı identifikator
´ Pˇr´ıklad: ukazka pouˇzit´ı #define SPOJ(a,b) #define PRINT(x)
a##b printf(#x " = %d\n", x)
Pouˇzit´ı a v´ysledek: SPOJ(file,id) PRINT(pocet)
IJC — Jazyk C
fileid printf("pocet" " = %d\n", pocet)
117/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ Uvod Ukazatele Operatory Pˇr´ıkazy Moduly Makra
Parametry pˇrekladu Nastaven´ı ruzn´ ˚ ych parametru˚ pˇrekladu: #pragma
<parametry>
Pˇr´ıklad: Borland C / DOS #pragma option -K #pragma warn amb
/* unsigned char */
Pˇr´ıklad: GCC #pragma message "Compiling " __FILE__ "..." #pragma GCC optimize ("-O1")
´ Poznamka: _Pragma IJC — Jazyk C
118/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
Standardn´ı ISO-C knihovny soubor assert.h ctype.h errno.h float.h limits.h locale.h math.h setjmp.h signal.h stdarg.h stddef.h stdio.h stdlib.h string.h time.h IJC — Jazyk C
co obsahuje ˇ ı. Makro assert pro laden´ Makra pro klasifikaci znaku. ˚ ´ ı chybov´ych kod ´ u. Definuje pojmenovan´ ˚ Parametry pro floating-point funkce. Rozsahy cel´ych cˇ ´ısel. ´ Funkce pro narodn´ ı/jazykovou podporu. ´ Matematicke funkce. Typy pro funkce longjmp a setjmp. Konstanty a deklarace pro funkce signal a raise ´ s promenn´ ˇ ym poˇctem argumentu. Makra pro praci ˚ ˇ Nekter a´ makra a datove´ typy. Typy,makra a funkce pro standardn´ı vstup/v´ystup Obecneˇ pouˇzitelne´ funkce (konverze, ˇrazen´ı) ´ s ˇretezci ˇ ˇ ı. Funkce pro praci a pamet´ ´ s cˇ asem. Typy a funkce pro praci 119/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
ˇ ı assert.h – Makro pro laden´ Implementace: #define assert(podminka) if(!podminka) ..... ´ ı podm´ınek diagnostika logick´ych chyb – testovan´ (precondition, postcondition) ˇ ı podm´ınky vyp´ısˇ e: pˇri nesplnen´ text "Assertion failed: " text podm´ınky x < 0 ´ jmeno souboru __FILE__ ˇc´ıslo ˇradku ´ __LINE__ ´ C99: jmeno funkce __func__ ´ ım makra NDEBUG lze vypnout definovan´ #define NDEBUG #include
120/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
Pˇr´ıklad
//#define NDEBUG #include
IJC — Jazyk C
121/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
ctype.h – makra pro klasifikaci znaku˚ int int int int int int int int int int int int int
isalnum(int c) isalpha(int c) iscntrl(int c) isdigit(int c) isgraph(int c) islower(int c) isprint(int c) ispunct(int c) isspace(int c) isupper(int c) isxdigit(int c) toupper(int c) tolower(int c)
p´ısmeno nebo cˇ ´ıslice [A-Za-z0-9] p´ısmeno [A-Za-z] ˇr´ıdic´ı znak cˇ ´ıslice [0-9] tisknuteln´y znak bez mezery male´ p´ısmeno [a-z] tisknuteln´y znak vˇcetneˇ mezery tisknuteln´y znak bez alnum a mezery ˇ oddelovaˇ c velke´ p´ısmeno [A-Z] ´ sˇ estnactkov a´ cˇ ´ıslice [0-9A-Fa-f] pˇrevod znaku na velke´ p´ısmeno pˇrevod znaku na male´ p´ısmeno
´ Poznamky: Rozsah parametru: unsigned char + EOF Makra vrac´ı hodnoty ==0 a !=0 (NE 0 nebo 1) IJC — Jazyk C
122/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ errno.h – chybove´ kody int errno ´ ı (pseudo)promenn ˇ a´ nastavovana´ std. funkcemi, je globaln´ ´ na zaˇcatku programu je nulova´ ´ Norma definuje pouze zakladn´ ı hodnoty: EDOM EILSEQ ERANGE
´ domenov a´ chyba C99: chyba konverze na wchar_t pˇreteˇcen´ı nebo podteˇcen´ı
ˇ implementace pak podle OS doplnuje dalˇs´ı ´ Poznamka: perror()
IJC — Jazyk C
123/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
float.h – charakteristiky floating-point typu˚
´ ı: FLT_ROUNDS Zaokrouhlovan´ FLT_EVAL_METHOD ´ Zaklad: FLT_RADIX Minimum, maximum a pˇresnost: {FLT|DBL|LDBL} *_MANT_DIG, *_DIG, DECIMAL_DIG, *_MAX, *_MIN, *_EPSILON, *_MIN_EXP, *_MIN_10_EXP, *_MAX_EXP, *_MAX_10_EXP,
IJC — Jazyk C
124/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
limits.h – rozsahy celoˇc´ıseln´ych typu˚
CHAR_BIT = poˇcet bitu˚ typu char MB_LEN_MAX = max poˇcet bajtu˚ v ’xxx’ SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, CHAR_MIN, CHAR_MAX SHRT_MIN, SHRT_MAX, USHRT_MAX INT_MIN, INT_MAX, UINT_MAX LONG_MIN, LONG_MAX, ULONG_MAX C99: LLONG_MIN, LLONG_MAX, ULLONG_MAX
IJC — Jazyk C
125/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ locale.h – funkce pro narodn´ ı/jazykovou podporu ´ datum, cˇ as, mena, ˇ Konvence pro formaty: znaky abecedy, ˇrazen´ı ˇretezc ˇ u, ˚ ... ˇ ´ ı standardn´ıch funkc´ı (isalpha(), ...) Ovlivnuje chovan´ Definuje typ struct lconv, makra LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME a funkce char *setlocale(int category, const char *locale); struct lconv *localeconv(void); Po startu programu plat´ı: setlocale(LC_ALL, "C");
IJC — Jazyk C
126/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
math.h – matematicke´ funkce
ˇ zne´ matematicke´ funkce pro double, float Definuje vˇsechny beˇ (pˇr´ıpona f), a long double (pˇr´ıpona l): sin, asin, cos, acos, tan, atan, atan2, ... sqrt, pow, exp, log, log10, ... lgamma, tgamma, ... fabs, fmin, fmax, ... floor, ceil, round, fmod, modf, ... makra INFINITY, isinf(), NAN, isnan(x) ´ Poznamky: C99: complex varianty: csin, csinf, ...
IJC — Jazyk C
127/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ ı skoky setjmp.h – nelokaln´ deklarace: int setjmp(jmp_buf jmpb); void longjmp(jmp_buf jmpb, int retval); ´ ı skok setjmp – pˇr´ıprava pro nelokaln´ ´ ı skok longjmp – provede nelokaln´ ´ ı longjmp obnov´ı stav programu tak, jakoby setjmp volan´ ´ skonˇcil s navratovou hodnotou retval. (longjmp nemuˇ ˚ ze ´ pˇr´ıpadeˇ je zmen ˇ ena ˇ pˇredat hodnotu 0 v retval, v takovem na 1.) ´ longjmp muˇ pouze z funkce, ktera´ byla ˚ ze b´yt volano ´ zavolana z funkce, ktera´ volala pˇr´ısluˇsn´y setjmp. setjmp lze volat jen z vhodn´ych m´ıst a dojde k naruˇsen´ı ˇ ych, ktere´ byly zmen ˇ eny ˇ mezi volan´ ´ ım ne-volatile promenn´ setjmp a longjmp. IJC — Jazyk C
128/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ ı skoky setjmp.h – nelokaln´
ˇ setjmp je pouˇzitelne´ pro oˇsetˇren´ı chyb a v´yjimek (nekdy se ´ ı uloh pouˇz´ıva´ i pro implementaci kooperativn´ıho zpracovan´ ´ - viz ”coroutines”) ´ Navratov e´ hodnoty: ´ Kdyˇz dojde k navratu ´ setjmp vrac´ı 0 kdyˇz je volan. ´ ı longjmp, setjmp vrac´ı nenulovou z setjmp po volan´ hodnotu. longjmp se nikdy nevrac´ı
IJC — Jazyk C
129/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
Pˇr´ıklad pouˇzit´ı setjmp(), longjmp() void subroutine(jmp_buf jmp) longjmp(jmp,1); }
{
int main() { int value; jmp_buf jmp; value = setjmp(jmp); if (value != 0) { printf("Byl vol´ an longjmp(jmp,%d)\n", value); exit(value); } printf("Vol´ an´ ı podprogramu ... \n"); subroutine(jmp); return 0; } IJC — Jazyk C
130/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ ı signal ´ u˚ signal.h – zpracovan´ Komunikace procesu, ˚ v´yjimky void (*signal(int sig, void (*func)(int s)))(int); int raise(int sig); raise signal
´ cˇ ´ıslo sig procesu vyˇsle signal ´ zpracovan ´ urˇcuje jak bude pˇrijat´y signal
Definovane´ konstanty: SIG_DFL SIG_ERR SIG_IGN
nastav´ı implicitn´ı obsluhu ´ indikuje chybu pˇri navratu z funkce signal ´ ignoruje signal
Uˇzivatelem specifikovane´ obsluˇzne´ funkce mohou konˇcit ´ ım abort, _exit, exit, nebo longjmp. return nebo volan´ IJC — Jazyk C
131/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ u˚ Typy signal SIGABRT SIGFPE SIGILL SIGINT SIGSEGV SIGTERM
´ ı ukonˇcen´ı abnormaln´ ´ ˇ ı nulou) chyba operace v plovouc´ı cˇ arce (delen´ ´ ı operace nelegaln´ ctrl-C ˇ chyba pˇr´ıstupu k pameti poˇzadavek ukonˇcen´ı programu
´ Poznamky: ´ ´ ı pˇri signalu ´ behem ˇ Problemy: nedefinovane´ chovan´ ´ ´ obsluhy jineho signalu ´ nevhodne´ – pouˇz´ıvat POSIX signaly ´ ISO C signaly ´ u˚ UNIX definuje cca 30 typu˚ signal IJC — Jazyk C
132/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
ˇ ym poˇctem argumentu˚ stdarg.h – funkce s promenn´ va_list
typ ukazatele na argumenty
Makra pro pˇrenositeln´y pˇr´ıstup k argumentum: ˚ void va_start(va_list ap, lastfix); type va_arg(va_list ap, type); void va_end(va_list ap); Makro va_start mus´ı b´yt pouˇzito jako prvn´ı. Nastav´ı ap tak, aby ukazoval na prvn´ı z voliteln´ych argumentu˚ funkce. Napˇr´ıklad: void f(int i, char *lastfix, ...); Jednotlive´ hodnoty argumentu˚ vrac´ı makro va_arg. Druh´y parametr type urˇcuje typ argumentu. (Nelze pouˇz´ıt typy char, unsigned char, nebo float.) ´ ı argumentu. Nakonec va_end uzavˇre zpracovan´ ˚ IJC — Jazyk C
133/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ Pˇr´ıklad: Souˇcet seznamu cˇ ´ısel ukonˇceneho nulou int sum(int i1, ...) { int total = i1; va_list ap; // ukazatel int arg; va_start(ap, i1); while ((arg = va_arg(ap,int)) != 0) // 0=konec total += arg; va_end(ap); return total; } int main(void) { printf("Souˇ cet = %d\n", sum(1, 2, 3, 4, 0)); return 0; } IJC — Jazyk C
134/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
ˇ stddef.h – nekter a´ makra a datove´ typy ptrdiff_t size_t wchar_t NULL offsetof( typ, ˇ clen ) Pˇr´ıklady:
rozd´ıl ukazatelu˚ velikost objektu˚ ´ znaky (UNICODE) ’ˇsiroke’
struct xx { int a, b; }; size_t off = offsetof( struct xx, b ); size_t sz = sizeof( struct xx ); int p[10]; ptrdiff_t dif = (char*)&p[10] - (char*)&p[0]; wchar_t c = L’H’; IJC — Jazyk C
135/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
stdio.h – standardn´ı vstup/v´ystup
Typy: size_t FILE fpos_t Makra:
ˇ velikost objektu˚ v pameti soubor pozice v souboru
NULL, EOF FOPEN_MAX, FILENAME_MAX SEEK_CUR, SEEK_END, SEEK_SET ˇ e: ´ Promenn stdin, stdout, stderr
IJC — Jazyk C
136/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
stdio.h – standardn´ı vstup/v´ystup Funkce: remove, rename, tmpfile fopen, freopen, fread, fwrite, fclose fprintf, fscanf, printf, scanf, sprintf, sscanf vfprintf, vprintf, vsprintf, fgetc, fgets, fputc, fputs, getc, getchar, putc, putchar, puts ungetc, fgetpos, fseek, fsetpos, ftell, rewind clearerr, feof, ferror, perror ´ Poznamka: C99: orientace, mbstate_t, fwide(), getwchar(), wprintf(), ... IJC — Jazyk C
137/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
funkce getchar, putchar int getchar(void); cˇ te jeden znak stdin. Naraz´ı-li na konec souboru, vrac´ı hodnotu EOF. Ekvivalent getc(stdin). int putchar(char c); zapisuje jeden znak do stdout. Nelze-li zapsat, vrac´ı EOF, jinak vrac´ı c. Ekvivalent putc(c,stdout). Pˇr´ıklad: konverze na mala´ p´ısmena (filtr) #include <stdio.h> #include
138/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
Funkce fgets char *fgets(char *s, int size, FILE *stream); ´ ˇ snem ´ cˇ ten´ı, NULL cˇ te ˇradek ze souboru stream. Vrac´ı s pˇri usp ´ eˇ pˇri EOF. Znak ’\n’ pˇreˇcte a uloˇz´ı do s (na rozd´ıl od gets). Funkce gets uˇz nen´ı v ISO C11 char *gets(char *s); ´ Nepouˇz´ıvat – nekontroluje delku vstupu! Funkce puts int puts(const char *s); ˇ ´ zap´ısˇ e ˇretezec do stdout a pˇrejde na nov´y ˇradek (na rozd´ıl od ˇ jinak vrac´ı nezapornou ´ fputs). Vrac´ı EOF pˇri chybe, hodnotu. IJC — Jazyk C
139/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ Funkce printf – formatovan´ y v´ystup do stdout int printf(const char *fmt, ...); ˇ ´ tisku fmt: ˇretezec obsahuj´ıc´ı format % d o x u c s e f g
-
IJC — Jazyk C
prefix form´ atu des´ ıtkovˇ e cel´ e ˇ c´ ıslo oktalovˇ e cel´ e ˇ c´ ıslo sestn´ ˇ actkovˇ e cel´ e ˇ c´ ıslo des´ ıtkovˇ e bez znam´ enka znak retˇ ˇ ezec pohybliv´ a ˇ c´ arka s exponentem pohybliv´ a ˇ c´ arka bez exponentu kratˇ s´ ı z %e nebo %f 140/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
Funkce printf – pˇr´ıklady
%5.2lf %10s %-10s %10.5s %.10s % d %#g %06x
IJC — Jazyk C
´ long float 5 m´ıst, 2 desetinna, ´ min. delka 10 ´ ı doleva zarovnan´ ´ delka 10, tiskne pouze 5 znaku, ˚ zleva mezery ˇ tisk ˇretezce, je-li delˇs´ı max. 10 znaku˚ ´ ´ znamenko ’-’ nebo ’ ’ na zaˇcatku cˇ ´ısla vˇzdy desetinna´ teˇcka, ponecha´ koncove´ nuly ponecha´ uvodn´ ı nuly: -00001 ´
141/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ Funkce scanf – formatovan´ y vstup ze stdin int scanf(const char *fmt, ...); ˇ sneˇ naˇcten´ych format ´ u˚ podle specifikace: vrac´ı poˇcet usp ´ eˇ znaky ’ ’, ’\t’, ’\n’ se ignoruj´ı jine´ znaky se mus´ı shodovat se vstupn´ım textem ´ % – prefix formatu * – potlaˇc´ı pˇriˇrazen´ı volitelneˇ sˇ ´ıˇrka pole ´ vstup format argument d, ld des´ıtkove´ cˇ ´ıslo int*, long* o, lo osmiˇckove´ cˇ ´ıslo int*, long* ´ x, lx sˇ estnactkov e´ cˇ ´ıslo int*, long* h short short* c jedin´y znak char* ˇretezec ˇ s char[], char* ´ e´ cˇ ´ıslo f, lf realn float*, double* IJC — Jazyk C
142/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
Funkce scanf – pˇr´ıklady
int i; float x; char name[50]; scanf("%2d %f %*d %2s", &i, &x, name); /* & */ Vstup: 56789 0123 45a72 V´ysledek: i = 56; x = 789.0; name = "45"
IJC — Jazyk C
143/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
Funkce *printf *scanf fprintf, fscanf – tisk a cˇ ten´ı ze souboru int fprintf(FILE *f, const char *fmt, ...); int fscanf(FILE *f, const char *fmt, ...); ´ e´ konverze v pameti ˇ sprintf, sscanf – formatov int sprintf(char *s, const char *fmt, ...); int sscanf(const char *s, const char *fmt, ...); ´ Poznamky: ´ zajiˇst’uje programator ´ konzistenci parametru˚ a formatu scanf vyˇzaduje ukazatele jako parametry ´ ı pameti ˇ scanf, sprintf — nebezpeˇc´ı pˇrepsan´ implicitn´ı konverze/rozˇs´ıˇren´ı argumentu˚ IJC — Jazyk C
144/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
Pˇr´ıklad: int i; char c; scanf(" %d ", i ); scanf(" %d ", &c );
IJC — Jazyk C
/* pozor - chyba! */ /* pozor - chyba! */
145/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ se soubory Prace Funkce fopen – otevˇren´ı souboru FILE *fopen(const char *name, const char *mode); ´ name je jmeno souboru, mode je reˇzim otevˇren´ı: ´ ıho souboru "r" "rb" cˇ ten´ı, cˇ ten´ı binarn´ ´ "w" "wb" zapis ´ an´ ´ ı na konec "a" "ab" pˇridav ´ Poznamka: kombinace "r+", "w+b", "rb+" atd... Pˇri chybeˇ vrac´ı NULL Pˇr´ıklad: const char *name = "test.txt"; FILE *fp = fopen( name, "r" ); if( fp == NULL ) error("soubor %s nelze otevˇ r´ ıt pro ˇ cten´ ı", name); IJC — Jazyk C
146/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
funkce fclose – uzavˇren´ı souboru int fclose(FILE *f); Vrac´ı EOF v pˇr´ıpadeˇ chyby, jinak nulu
IJC — Jazyk C
147/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
ˇ Pˇr´ıklad: zˇretezen´ ı souboru˚ na stdout (cat)
IJC
void filecopy(FILE *fp); int main(int argc, char *argv[]) { FILE *fp; if( argc==1 ) filecopy(stdin); else while( --argc > 0 ) if( (fp=fopen(*++argv,"r")) == NULL ) { printf("cat: can’t open %s \n", *argv); continue; /* dalˇ s´ ı soubor */ } else { filecopy(fp); fclose(fp); } return 0; — Jazyk } C
148/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
Pˇr´ıklad: cat – dokonˇcen´ı
void filecopy(FILE *fp) { /* neefektivn´ ı */ int c; while( (c=getc(fp)) != EOF ) putc( c, stdout ); }
IJC — Jazyk C
149/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
stdlib.h – obecneˇ pouˇzitelne´ funkce div_t, ldiv_t EXIT_FAILURE, EXIT_SUCCESS RAND_MAX MB_CUR_MAX Funkce:
typy pro div, ldiv parametry exit() maximum rand() max. poˇcet bajtu˚ v ’xxx’
abs, div, labs, ldiv bsearch, qsort, rand, srand atof, atoi, atol, strtod, strtol, strtoul mblen, mbstowcs, mbtowc, wcstombs, wctomb calloc, free, malloc, realloc abort, atexit, exit, getenv, system
IJC — Jazyk C
150/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
ˇ Pˇrevod ˇretezce na cˇ ´ıslo
double atof( const char * s); int atoi( const char * s ); long atol( const char * s ); double strtod( const char *s, char **endptr); long strtol( const char *s, char **endptr, int base); unsigned long strtoul(const char *s, char **e, int b); ˇ endptr – ukazatel do ˇretezce po konverzi (nen´ı-li NULL) ´ base – zaklad cˇ ´ıselne´ soustavy
IJC — Jazyk C
151/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
Funkce atexit ´ ı zadan´ych funkc´ı na konci programu Volan´ int atexit( void (*func)(void) ); ´ ı pˇred skonˇcen´ım programu registruje funkci pro zavolan´ (poˇrad´ı LIFO) dovoluje registraci min. 32 funkc´ı ˇ vrac´ı nulu v pˇr´ıpadeˇ usp ´ echu ´ ı chyb funkce exit – zpracovan´ void exit(int e); ´ ´ ukonˇc´ı program s navratov´ ym kodem e
IJC — Jazyk C
152/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
Funkce atexit – pˇr´ıklad #include <stdio.h> #include <stdlib.h> FILE *fp; void Close(void) { fputs("\nEXIT\n",fp); fclose(fp); } int main(int argc, char *argv[]) { // test argc ... if( (fp=fopen(argv[1],"w")) == NULL ) { fprintf(stderr, "can’t open %s \n", argv[1]); exit(1); // ukonˇ cen´ ı s chybou } atexit(Close); DoSomething(fp); // m˚ uˇ ze volat exit() return 0; // ukonˇ cen´ ı bez chyby - n´ asleduje exit(0); } IJC — Jazyk C
153/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
ˇ an´ ´ ı pameti ˇ Dynamicke´ pˇridelov
void void void void
*malloc(size_t size); *realloc(void *ptr, size_t size); *calloc(size_t memb, size_t size); free(void *ptr);
malloc free calloc realloc
IJC — Jazyk C
ˇ ı pamet ˇ ’ o zadane´ velikosti pˇridel´ ˇ ˇ’ uvoln´ı pˇridelenou pamet ˇ ı a nuluje pamet ˇ’ pˇridel´ ˇ s´ı/zmenˇs´ı pˇridelenou ˇ ˇ ’ (muˇ zvetˇ pamet ˚ ze pˇresunout)
154/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
Pˇr´ıklad: malloc a free #include <stdlib.h> typedef struct prvek { int data; struct prvek *dalsi; } prvek; prvek *novy_prvek(void) { prvek *p = malloc(sizeof(prvek)); if( p == NULL ) /* pozor! mus´ ı se testovat! */ error("chyba: m´ alo pamˇ eti"); return p; } void zrus_prvek(prvek *ptr) free(ptr); } IJC — Jazyk C
{
155/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ s ˇretezci ˇ ˇı string.h – prace a pamet´ strlen strcpy strncpy strcat strncat strcmp strncmp strcoll strchr strrchr strstr
´ ˇretezce ˇ delka ˇ kopie ˇretezce ˇ kopie ˇretezce (max. n znaku) ˚ ˇ pˇripojen´ı ˇretezce ˇ pˇripojen´ı ˇretezce (max. n znaku) ˚ ´ ı dvou ˇretezc ˇ u˚ porovnan´ ´ ı dvou ˇretezc ˇ u˚ (max. n znaku) porovnan´ ˚ ´ ´ porovnan´ı podle narodn´ı abecedy (LC_COLLATE) ´ ı znaku vyhledan´ ´ ı znaku od konce vyhledan´ ´ ı podˇretezce ˇ vyhledan´
size_t, NULL
IJC — Jazyk C
156/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ s pamet´ ˇı Prace ˇ memcpy kopie bloku˚ pameti ˇ memmove kopie pˇrekr´yvaj´ıc´ıch se bloku˚ pameti ´ ı bloku˚ pameti ˇ memcmp porovnan´ ´ ı bajtu memchr vyhledan´ memset nastaven´ı bajtu˚ ... ˇ Poˇcet bajtu˚ je dalˇs´ım parametrem techto funkc´ı. Pˇr´ıklad: void f(void) { int pole[SIZE]; int pole2[SIZE]; memset(pole, 0, SIZE * sizeof(pole[0]) ); memcpy(pole2, pole, sizeof(pole2) ); } IJC — Jazyk C
157/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ s cˇ asov´ymi udaji time.h – prace ´ CLOCKS_PER_SEC clock_t time_t struct tm funkce: clock difftime mktime time
poˇcet tiku˚ za sekundu ´ systemov´ y cˇ as [tiky] cˇ as [s] tm_sec, tm_mday, ...
´ cˇ as od zaˇcatku programu [tiky] rozd´ıl cˇ asu˚ v sec pˇrevod na intern´ı reprezentaci cˇ asu souˇcasna´ hodnota cˇ asu [s]
asctime, ctime, gmtime, localtime, strftime
IJC — Jazyk C
158/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
a c e f l m s t
´ s cˇ asov´ymi udaji Pˇr´ıklad: Prace ´
struct tm t; t.tm_year = 1995 - 1900; t.tm_mon = 10 - 1; t.tm_mday = 6; t.tm_hour = 12; t.tm_min = 0; t.tm_sec = 1; t.tm_isdst = -1; if( mktime(&t) != -1 ) if(t.tm_wday == 5) puts("p´ atek");
IJC — Jazyk C
/* rok /* mˇ es´ ıc /* den
od 1900 */ 0..11 */ 1..31 */
/* letn´ ı ˇ cas? */ /* OK */
159/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Jazyk Knihovny
ISO-C99 Nove´ vlastnosti jazyka C podle normy C99: typ long long a souvisej´ıc´ı funkce negeneruje implicitn´ı prototypy funkc´ı inline funkce (§6.7.4) ˇ Nekdy inline definice vyˇzaduje dalˇs´ı extern deklaraci v ´ modulu a nen´ı specifikovano, ´ jedinem zda se funkce ´ rozvine nebo zavola. Pozor na stare´ verze GCC (4.3+ a -std=c99 je O.K.) inline int plus1(int a, int b) { return a+b; } inline int plus2(int a, int b) { return a+b; } int main(void) { // pouˇ zijte gcc -stdc=c99 return plus1(1,2)+plus2(3,4); // chyba bez -O2 } IJC — Jazyk C
160/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Jazyk Knihovny
´ (typ) { inicializace } Strukturovane´ literaly: ˇ u˚ (pouze ve Automaticka´ pole nekonstantn´ıch rozmer funkc´ıch) T f(int n) { int pole[n]; // variable-length array // ... } // n´ asleduj´ ıc´ ı T f(int n, int T f(int n, int T f(int n, int T f(int n, int
prototypy jsou ekvivalentn´ ı: m, int a[n][m]); m, int a[*][*]); m, int a[ ][*]); m, int a[ ][m]);
(viz ISO C99 §6.7.5.3) IJC — Jazyk C
161/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Jazyk Knihovny
pole na konci struktury (flexible array member) struct S { int n; T array[]; }; Typ _Bool a makra v <stdbool.h> (konstanty true, false a typ bool). ´ typy Komplexn´ı cˇ ´ısla. V
IJC — Jazyk C
162/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Jazyk Knihovny
restrict ukazatel je jedinou pˇr´ıstupovou cestou k objektu. ´ Vhodne´ pro lepˇs´ı optimalizaci; kvalifikator restrict lze ˇ v´yznamu. kdykoli vynechat bez zmeny Pˇr´ıklad: void f (char * restrict s1, const char * restrict s2, int n) { while(n--) *s1++ = *s2++; }
void g1 (int p[restrict][32]); void g2 (int (* restrict p)[32]);
IJC — Jazyk C
163/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Jazyk Knihovny
Nove´ funkce: snprintf, vscanf ´ ´ Identifikator jmena funkce: __func__ ´ \uXXXX \UXXXXXXXX Znakove´ literaly ˇ ym poˇctem argumentu˚ makra s promenn´ #define debug(...) #define showlist(...)
fprintf(stderr, __VA_ARGS__) puts(#__VA_ARGS__)
standardn´ı #pragma definice #pragma STDC co jak co := {FP_CONTRACT|FENV_ACCESS|CX_LIMITED_RANGE} jak := {ON|OFF|DEFAULT} ´ pragma operator #define M
IJC — Jazyk C
_Pragma(string-literal) // v makrech
164/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Jazyk Knihovny
Standardn´ı knihovny C99 soubor complex.h fenv.h
inttypes.h
stdbool.h stdint.h
tgmath.h IJC — Jazyk C
co obsahuje podpora pro komplexn´ı cˇ ´ısla nastaven´ı parametru˚ prostˇred´ı pro v´ypoˇcty ´ ´ ı, zprav plovouc´ı cˇ arce (reˇzim zaokrouhlovan´ ´ ı v´yjimek) covan´ rozˇs´ıˇren´ı definic celoˇc´ıseln´ych typu˚ v stdint.h ´ o makra pro formaty pro printf a deklarace funkc´ı strtoimax, strtoumax, wcstoimax a wcstoumax podpora typu bool celoˇc´ıselne´ typy – napˇr´ıklad intmax_t, uintmax_t, int8_t, uint8_t, int_least32_t, int_fast32_t, atd. typoveˇ genericka´ makra 165/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Jazyk Knihovny
´ ı Standardn´ı knihovny C99 – pokraˇcovan´
soubor iso646.h wchar.h
wctype.h
IJC — Jazyk C
co obsahuje AMD1: podpora omezen´ych znakov´ych sad (and == && atd.) AMD1: podpora wchar_t, definuje napˇr´ıklad funkce: fwprintf, swprintf, wcstol, wcscpy, wcsmemcpy, atd. AMD1: ctype.h pro typ wchar_t — definuje typy a funkce iswdigit atd.
166/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Jazyk Knihovny
Genericka´ makra v
IJC — Jazyk C
167/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ ı Pˇrehled Techniky Nastroje Testovan´
ˇ ı programu˚ Laden´ ´ ı mame ´ Pˇri programovan´ dveˇ moˇznosti: ´ programy bez chyb psat ˇ nebo se nauˇcit hledat a odstranovat chyby v programech (debugging) ˇ ı je cˇ asoveˇ naroˇ ´ cne´ laden´ je tˇreba se uˇcit z vlastn´ıch i ciz´ıch chyb ´ vliv pouˇziteho programovac´ıho jazyka
Prevence chyb Techniky pro omezen´ı chyb: ´ dobr´y navrh programu (rozhran´ı, ...) dobr´y styl psan´ı programu˚ ´ ı okrajov´ych podm´ınek, assert(), ... dukladn e´ testovan´ ˚ ´ ıch dat omezen´ı globaln´ ´ ı nastroj ´ ´ pouˇz´ıvan´ u˚ pro kontrolu spravnosti programu˚ (lint, valgrind, electric fence, ...) ´ ´ Poznamka: Pozor na chyby zpusoben e´ nepochopen´ım kodu ˚ IJC — Jazyk C
168/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ ı Pˇrehled Techniky Nastroje Testovan´
Ladic´ı program (debugger) ´ ˇ ı stavu interaktivn´ı nastroj vhodn´y pro zjiˇsten´ moˇznosti ladic´ıch programu: ˚ ´ ı programu krokovan´ ˇ registru, v´ypis obsahu pameti, ˚ ... ´ v´ypis stavu zasobn´ ıku (stack-trace) ˇ y, HW) breakpoint (podm´ınen´ ˇ y, HW) watchpoint (podm´ınen´ ´ ˇ ´ automaticke spuˇsten´ı pˇri v´yskytu problemu ˇ post-mortem laden´ı: core ˇ z´ıc´ımu procesu pˇripojen´ı k jiˇz beˇ ´ e´ laden´ ˇ ı vzdalen ...
ˇ nejsou vˇzdy dostupne´ (embedded, nekter e´ jazyky, ...) ´ ´ ´ problemy: paraleln´ı procesy/vlakna, operaˇcn´ı systemy, ´ distribuovane´ systemy ´ er: ˇ ne vˇzdy vhodne´ Zav IJC — Jazyk C
169/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ ı Pˇrehled Techniky Nastroje Testovan´
ˇ ı programu˚ Techniky laden´ Pouˇzit´ı ladic´ıch programu. ˚ ´ V´ypisy (log-file) a jejich anal´yza (v´yhody: souˇcast ˇ ˇ s´ı). programu, lze zapnout/vypnout, nekdy efektivnejˇ ´ ı moˇznych ˇ chyb – doporucen´ ˇ ı Zkouman´ ´ pˇr´ıcin jednoduˇssˇ ´ı pˇr´ıpady: ´ ı obvykl´ych chyb: chybej´ ˇ ıc´ı & v scanf, chybne´ hledan´ ´ printf/scanf, a podobne´ (nastroje: ´ formaty gcc -Wall, program lint, ...) ˇ kodu ´ soustˇredit se na posledn´ı zmeny neopakovat stejne´ chyby, opravit vˇsechny v´yskyty chyby ´ ˇ ı na pozdejˇ ˇ s´ı dobu (pˇr´ıklad: Mars neodkladat laden´ Pathfinder – reset) sledovat ”stack-trace”– hodnoty parametru˚ funkc´ı ˇ unahlen ´ nedelat e´ opravy ˇ ´ ˇ ´ vysvetlit svuj jinemu (i kdyˇz tomu nerozum´ı) ˚ kod nekomu IJC — Jazyk C
170/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ ı Pˇrehled Techniky Nastroje Testovan´
ˇ s´ı pˇr´ıpady: sloˇzitejˇ zajistit reprodukovatelnost chyby sledovat cˇ etnost v´yskytu˚ chyby (napˇr´ıklad kaˇzd´ych X ´ +-1 – prohledat kod ´ na znaku˚ je chyba – asi problem v´yskyt konstant v okol´ı hodnoty X) kontroln´ı v´ypisy (log-file), grep ´ ı nastroj ´ pouˇz´ıvan´ u: ˚ grep, diff, awk, ... ´ ´ pˇridavat testy do kodu vizualizace v´ystupu˚ programu (graf) ´ ret testovac´ı pˇr´ıpady; redukce kodu ´ vytvaˇ s chybou na minimum ´ ˇ laden´ ˇ ı v pˇr´ıpadeˇ dlouhotrvaj´ıc´ıch zaznamenavat prub ˚ eh ´ u˚ problem
IJC — Jazyk C
171/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ ı Pˇrehled Techniky Nastroje Testovan´
ˇ s´ı pˇr´ıpady: nejsloˇzitejˇ ´ zkontrolovat lehce pˇrehlednuteln e´ chyby if (a & 1 == 0) { /* <<<< priorita */ /* nikdy se neprovede ... */ } switch (x) { /* ... */ defaut: /* <<<< pˇ reklep */ /* nikdy se neprovede ... */ } memset(p, n, 0); /* <<<< chybn´ e poˇ rad´ ı argument˚ u */ DPRINTF(("v´ ypis %d\n", i++)); /* <<<< co aˇ z zmiz´ ı? */ nehledat chyby, ktere´ nejsou (vzniknou napˇr´ıklad chybn´ym ´ ım) testovan´ ˇ an´ ´ ı zdroju˚ (memory leaks, file desc.) zkontrolovat uvolnov ´ velmi zˇr´ıdka muˇ OS, ˚ ze b´yt chyba v pˇrekladaˇci, knihovnach, HW (Pˇr´ıklad: isprint(getchar()) a dvoj´ı vyhodnocen´ı) IJC — Jazyk C
172/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ ı Pˇrehled Techniky Nastroje Testovan´
Nereprodukovatelne´ chyby ˇ ych zkontrolovat inicializaci promenn´ ´ ı testovac´ıho kodu ´ pokud po pˇridan´ chyba zmiz´ı – moˇzna´ ˇ (i printf muˇ ˇ’ a chyba alokace pameti ˚ ze alokovat pamet ˇ chovan´ ´ ı) zpusobit zmenu ˚ ´ vypada´ spravn ´ eˇ – nejak ˇ a´ jina´ cˇ ast ´ programu kdyˇz kod ’ ˇ (neinicializovan´y ukazatel, vracen´ ´ pˇrepisuje pamet ı odkazu ´ ı promennou, ˇ na lokaln´ pouˇzit´ı dynamicky alokovane´ ˇ po jej´ım uvolnen´ ˇ ı, dvakrat ´ free, ...) pameti ´ ´ ı malloc/free – knihovny (dmalloc, Nastroje: specialn´ efence, ...), program valgrind, ... ´ ı na prostˇred´ı: chyba v programu zavis´ ˇ ych prostˇred´ı (napˇr. LANG), kontrola nastaven´ı promenn´ ´ ´ pˇr´ıstupova´ prava, konfigurace systemu, ... (Pˇr´ıklad: MSDOS: ctrlZ je EOF — nefunguje stdin s bin. daty) IJC — Jazyk C
173/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ ı Pˇrehled Techniky Nastroje Testovan´
ˇ ı ciz´ıho kodu ´ Laden´ ´ Je chyba opravdu v ciz´ım kodu? ´ Nen´ı chyba uˇz znama nebo opravena v nove´ verzi? (bugzilla, ...) ´ ı pˇr´ıklad chyby a nahlasit ´ Vytvoˇrit minimaln´
IJC — Jazyk C
174/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ ı Pˇrehled Techniky Nastroje Testovan´
´ ˇ ı Nastroje pro laden´ debuggery: GDB, DDD, Insight, ... v´ypisy informac´ı o cˇ innosti procesu: ´ ´ strace, ptrace komunikace s jadrem systemu ´ ı funkc´ı sd´ılen´ych knihoven ltrace volan´ ps, top stav procesu ´ ´ script zaznam v´ystupu˚ na terminal lsof v´ypis otevˇren´ych souboru˚ fuser procesy pracuj´ıc´ı se souborem v´ypisy informac´ı o programu: ´ nm symboly v modulech/knihovnach ´ size velikost kodu, dat, ... ldd ktere´ dyn. knihovny jsou pouˇzity ˇ strings textove´ ˇretezce v bin. souboru ´ od, hexdump obsah souboru (ruzn ˚ e´ formaty) objdump obsah modulu/programu (disassembly,...) ´ pomocne´ textove´ nastroje: grep, cut, sort, diff, cmp, comm IJC — Jazyk C
175/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ ı Pˇrehled Techniky Nastroje Testovan´
´ ı programu˚ Testovan´
´ ı chyby testovaneho ´ Systematicke´ pokusy o vyvolan´ programu. ˇ ım, ale nen´ı to toteˇ ´ z. Souvis´ı s laden´ ´ Muˇ jejich ˚ ze odhalit chyby, ale nemuˇ ˚ ze dokazat nepˇr´ıtomnost.
IJC — Jazyk C
176/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ ı Pˇrehled Techniky Nastroje Testovan´
´ ı v prub ˇ Testovan´ ˚ ehu psan´ı programu testujte mezn´ı pˇr´ıpady: vstup odpov´ıdaj´ıc´ı velikosti pole +-1 ´ prazdn´ y vstup obrovsk´y vstup ´ ı znaky na vstupu specialn´
´ testujte pre- a post-conditions: zaporn e´ hodnoty nebo nula ´ a´ kladne´ cˇ ´ıslo (pˇr´ıklad USS Yorktown: tam, kde se oˇcekav ˇ ı nulou) delen´ ´ ı — testovat i ”pˇr´ıpady ktere´ nikdy defenzivn´ı programovan´ nenastanou” ´ testujte navratov e´ hodnoty funkc´ı (malloc, fopen, ...)
IJC — Jazyk C
177/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ ı Pˇrehled Techniky Nastroje Testovan´
´ ı Systematicke´ testovan´ ´ v prub ˇ testujte kod implementace ˚ ehu ´ ˇ ´ testujte jednoduche casti jako prvn´ı ´ jak´y v´ystup lze oˇcekavat ´ je tˇreba znat, ˇ rujte invariantn´ı vlastnosti (poˇcty zpracovan´ych oveˇ ´ zaznam u, ˚ kontroln´ı souˇcty, ...) ´ porovnejte nezavisl e´ implementace stejn´ych algoritmu˚ ˇ rte, zda testujete vˇsechny varianty kodu ´ oveˇ Automatizace testu˚ ´ ı s pˇredchoz´ı verz´ı automaticke´ regresn´ı testy – porovnan´ ´ ´ nezavisl e´ testy – obsahuj´ı vstupy a oˇcekavan e´ v´ystupy ... ´ Poznamka: ”unit testing”, ”code coverage analysis” IJC — Jazyk C
178/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ´ ı Pˇrehled Techniky Nastroje Testovan´
´ ı Tipy pro testovan´ vˇzdy testujte sve´ programy ´ tak, aby se oveˇ ˇ rilo oˇsetˇren´ı chyb (specialn´ ´ ı upravte kod ´ ˇ vracej´ıc´ı chybu, zmenˇsen´ı velikost´ı pol´ı, ...) alokator pameti ˇ e´ specialn´ ´ ımi hodnotami inicializujte pole a promenn testujte v ruzn´ ˚ ych prostˇred´ıch (jin´y OS, pˇrekladaˇc, HW) ˇ regulaci mnoˇzstv´ı testovac´ıch v´ypisu˚ umoˇznete (--verbose) ´ ım vypnete ˇ testovac´ı kod ´ (#define NDEBUG) pˇred odevzdan´
IJC — Jazyk C
179/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ Uvod do C++ Historie C C with classes ISO C ISO C++ ISO C ISO C++ ISO C ISO C++
(1973) (1981) (1990) (1998) (1999) (2011) (2011) (2014)
K&R = Kerninghan, Ritchie Bjarne Stroustrup, Bell Labs ´ mezinarodn´ ı norma jazyka C (C90) ´ mezinarodn´ ı norma C++ (C++98) norma jazyka C (C99) nova´ verze normy C++ (C++11) nova´ norma jazyka C (C11) aktualizace normy C++ (C++14)
Puvodn´ ı definic´ı je kniha Stroustrup: The C++ Programming ˚ Language (Addison-Wesley 1985, 1991, 1997, 2013). ´ e: ˇ C++14). Plat´ı norma ISO/IEC 14882:2014 (neformaln ´ Poznamka: Pˇrekladaˇce a v´yvojova´ prostˇred´ı pro jazyk C++ viz WWW. IJC — Jazyk C
180/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Charakteristika jazyka C++ ˇ Obecneˇ vyuˇziteln´y programovac´ı jazyk vyˇssˇ ´ı urovn e. ´ Je standardizovan´y (ISO/ANSI) ´ ren´ı knihoven. Podporuje abstraktn´ı datove´ typy a vytvaˇ ´ ˇ a´ kompatibilita) Nastupce jazyka C (zpetn Efektivita ˇ cnost) Objektova´ orientace (tˇr´ıdy, dediˇ ˇ zovat operatory ´ Moˇznost pˇreteˇ Genericke´ tˇr´ıdy a funkce (ˇsablony) Obsluha v´yjimek Mnoho ruzn´ ˚ ych implementac´ı pˇrekladaˇcu˚ Mnoˇzstv´ı prostˇredku˚ pro ruzn ˚ e´ aplikace (GUI, ...)
IJC — Jazyk C
181/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Nev´yhody C++
ˇ s´ı a sloˇzitejˇ ˇ s´ı neˇz C Je podstatneˇ vetˇ Nen´ı cˇ isteˇ objektoveˇ orientovan´y (napˇr. typ int nen´ı tˇr´ıda a ˇ dedit) ˇ nelze z nej ˇ nekter ˇ ´ ´ ı pol´ı se Zdedil e´ problemy jazyka C (indexovan´ ´ ı sprava ´ pameti, ˇ ...) nekontroluje, manualn´ Nen´ı zcela kompatibiln´ı s jazykem C ˇ Ne vˇsechny pˇrekladaˇce dostateˇcneˇ vyhovuj´ı norme. ´ Poznamka: Citace z Internetu: ”There are only two kinds of programming languages: those people always bitch about and those nobody uses.”
IJC — Jazyk C
182/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Pˇr´ıklady – pˇreklad a sestaven´ı programu Soubor ahoj.cc: #include
// tisk ˇ retˇ ezce
´ ı (UNIX, pˇrekladaˇc GNU C++): Zpusob zpracovan´ ˚ g++ -o ahoj ahoj.cc ./ahoj
# pˇ reklad, sestaven´ ı # spuˇ stˇ en´ ı
´ Poznamka: Pˇr´ıpony .cc, .cpp, .C, .c++, .cxx ˇ ı (UNIX, GNU C++): Optimalizace a laden´ g++ -O2 -o prog prog.cc g++ -g -o prog prog.cc gdb prog IJC — Jazyk C
# +optimalizace # +ladic´ ı informace # ladˇ en´ ı 183/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
ˇ Pˇr´ıklad: cˇ ten´ı a tisk C++ ˇretezce
#include
// std::string
int main() { using namespace std; // === nemus´ ıme ps´ at std:: cout << "C++ string" << endl; string s; cout << "s = " << s << endl; cout << "string s (libovoln´ a d´ elka): " << flush; cin >> s ; // sledujte jak funguje (ˇ cte slova) cout << "s = " << s << endl; }
IJC — Jazyk C
184/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
ˇ ´ Pˇr´ıklad: cˇ ten´ı a tisk C ˇretezce v C++ (nevhodne) ˇI ´VAT] // hroz´ ı chyba typu "buffer overflow" [NEPOUZ #include
// nemus´ ıme ps´ at std::
int main() { cout << "C string" << endl; char s[100] = ""; cout << "s = " << s << endl; cout << "string s (max 99 zn): " << flush; cin >> s ; // ˇ cte slovo, pozor na "buffer overflow" cout << "s = " << s << endl; } IJC — Jazyk C
185/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Pˇr´ıklad: cˇ etnost slov // g++ -std=c++11 (nebo c++0x) #include
IJC — Jazyk C
186/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Pˇr´ıklad: cˇ etnost slov (nemodern´ı, C++98) #include
// kontejner std::map
typedef std::map<std::string,int> typedef map_t::iterator
map_t; mapiter_t;
int main() { std::string word; map_t m; // asociativn´ ı pole while( std::cin >> word ) // ˇ cte slova m[word]++; for(mapiter_t i=m.begin(); i!=m.end(); ++i) // tisk std::cout << i->first <<"\t"<< i->second <<"\n"; } IJC — Jazyk C
187/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Pˇr´ıklad: ˇrazen´ı cˇ ´ısel, iterator // g++ -std=c++11 #include
// // // //
cout vector sort, copy ostream_iterator
int main() { using namespace std; vector
IJC — Jazyk C
188/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Pˇr´ıklad: ˇrazen´ı cˇ ´ısel (nemodern´ı, C++98) #include
189/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Pˇr´ıklad: ˇrazen´ı cˇ ´ısel — varianta 2 #include #include #include #include
// // // //
vector sort, copy cout ostream_iterator
int main() { using namespace std; vector
190/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Pˇr´ıklad: lambda funkce // g++ -std=c++11 #include
// cout // vector // sort, copy, for_each
int main() { using namespace std; vector
191/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Rozd´ıly mezi C a C++
´ ı z jazyka C (C++98 z C90, C++11 z C99) C++ vychaz´ ´ z C++ programy Dobˇre napsane´ C programy jsou teˇ ˇ (s nekolika v´yjimkami: nova´ kl´ıcˇ ova´ slova, povinne´ ˇ s´ı typova´ kontrola, ...) prototypy funkc´ı, silnejˇ ˇ pˇrekladaˇcem kromeˇ Rozd´ıly mezi C a C++ jsou zjiˇsteny ˇ nekolika v´yjimek: ´ jsou typu char Znakove´ literaly sizeof(’a’) == sizeof(int) // C sizeof(’a’) == sizeof(char) // C++
IJC — Jazyk C
192/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
... V´ycˇ tov´y typ nen´ı ekvivalentn´ı typu int enum e { A }; sizeof(A) == sizeof(int) // C sizeof(A) == sizeof(e) // C++ != sizeof(int) ´ struktury v C++ muˇ ´ objektu, funkce, Jmeno ˚ ze pˇrekr´yt jmeno ´ bloku: v´ycˇ tu nebo typu v nadˇrazenem int x[99]; void f() { struct x { int a; }; sizeof(x); /* pole v C, struktura v C++ */ }
IJC — Jazyk C
193/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Rozˇs´ıˇren´ı C++ proti C99
typ reference anonymn´ı unie (jsou v C11) ˇ zovan´ ´ ı funkc´ı a operator ´ u˚ pˇreteˇ ´ operatory new, delete, new[] a delete[] tˇr´ıdy (class), abstraktn´ı tˇr´ıdy automaticka´ inicializace (konstruktory, destruktory) zapouzdˇren´ı (private, public, protected) ˇ cnost, nasobn ´ ˇ cnost dediˇ a´ dediˇ ´ ı funkce) polymorfismus (virtualn´ uˇzivatelem definovane´ konverze
IJC — Jazyk C
194/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ı Rozˇs´ıˇren´ı C++ proti C99 – pokraˇcovan´
´ ´ jmeno tˇr´ıdy a v´ycˇ tu je jmeno typu ukazatele na cˇ leny tˇr´ıd v inicializaci statick´ych objektu˚ je dovolen obecn´y v´yraz genericke´ datove´ typy – sˇ ablony (template, typename) obsluha v´yjimek (try, catch, throw) prostory jmen (namespace, using) ´ ı (static_cast, const_cast, nove´ zpusoby pˇretypovan´ ˚ reinterpret_cast, dynamic_cast) ˇ informace o typu za behu programu (typeid, type_info) kl´ıcˇ ove´ slovo mutable
IJC — Jazyk C
195/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Novinky v C++11 proti C++98 R-hodnotove´ reference, ”move”konstruktory constexpr ˇ ve specifikaci dat ”POD = Plain Old Data” Zmeny extern template Inicializaˇcn´ı seznamy ´ Sjednocen´y zapis inicializace (int a{5};) Inference typu˚ (auto,decltype) for cyklus pˇres rozsah kontejneru Lambda funkce a v´yrazy Alternativn´ı syntaxe funkc´ı []fce(int x)->int{return x;} ´ ı identifikatory ´ Specialn´ override, final nullptr IJC — Jazyk C
196/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ı Novinky v C++11 – pokraˇcovan´ ´ silneˇ typovane´ v´ycˇ ty Nove, ´ v C++98) template
197/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Novinky v C++14 ˇ a zruˇsen´ı ruzn´ Male´ zmeny ˚ ych omezen´ı: auto f() { .... return x; } auto parametry lambda funkc´ı ˇ ych sˇ ablony promenn´ C99 inicializace { .field=value, .... } ´ ı literaly ´ binarn´ 0b0110 ˇ ´ oddelovaˇ ce v numerick´ych literalech 10’000’000 vylepˇsen´ı a rozˇs´ırˇen´ı std knihovny ... ´ Poznamka: Pˇrekladaˇce a podpora C++14
IJC — Jazyk C
198/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
C++ ´ Poznamky /* text pozn´ amky */ // text pozn´ amky plat´ ı aˇ z do konce ˇ r´ adku ´ Vyhrazene´ identifikatory vˇse co obsahuje dvojite´ podtrˇzen´ı __ na libovolne´ pozici ´ vˇse co zaˇc´ına´ podtrˇzen´ım _ nasledovan´ ym velk´ym p´ısmenem ´ ı symboly zaˇc´ınaj´ıc´ı podtrˇzen´ım _ globaln´ ´ ı identifikatory ´ Specialn´ v C++11 override final IJC — Jazyk C
199/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Kl´ıcˇ ova´ slova C++ alignas * alignof * and and_eq asm auto bitand bitor bool break case catch char char16_t * char32_t * class compl const const_cast constexpr * continue IJC — Jazyk C
decltype * default delete do double dynamic_cast else enum explicit export extern false float for friend goto if inline int long mutable
namespace new noexcept * not not_eq nullptr * operator or or_eq private protected public register reinterpret_cast return short signed sizeof static static_assert * static_cast
struct switch template this thread_local* throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while xor xor_eq 200/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Alternativn´ı reprezentace <% { and %> } bitand <: [ compl :> ] not_eq %: # or_eq %:%: ## xor_eq
&& & ~ != |= ^=
and_eq bitor not or xor
&= | ! || ^
´ Poznamka: Digraphs (<:) ´ Poznamka: Trigraphs (??/)
(bude zruˇseno v C++17)
// Provede se n´ asleduj´ ıc´ ı pˇ r´ ıkaz??/ i++;
IJC — Jazyk C
201/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ Literaly ´ u˚ je stejna´ jako v C. Syntaxe cˇ ´ıseln´ych literal ´ (operator "") C++11: uˇzivatelem definovane´ literaly Pˇr´ıklad: BigNumber operator "" _big(const char * literal_string); BigNumber some_variable = 12345_big; ´ jsou typu: Znakove´ literaly char v C++ int
v C, v C++ pouze v´ıceznakove´ (mbc)
´ Poznamka: V C++ existuj´ı 3 ruzn ˚ e´ znakove´ typy: char, unsigned char a signed char IJC — Jazyk C
202/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Typova´ kontrola ˇ s´ı neˇz v C: Je v C++ silnejˇ Deklarace: void (*funptr)(); je ukazatel na fci vracej´ıc´ı void v C, ukazatel na fci vracej´ıc´ı void bez parametru˚ v C++ Ukazatel na konstantn´ı objekt nelze pˇriˇradit do ukazatele na nekonstantn´ı objekt. ´ ı programu rozliˇs´ı funkce s Typova´ kontrola pˇri sestavovan´ ruzn´ ˚ ymi parametry V´ycˇ tove´ typy: ´ lze pˇriˇradit pouze konstantu daneho typu lze vynechat kl´ıcˇ ove´ slovo enum pˇri pouˇzit´ı ´ ´ ı na hodnotach ´ prvku˚ sizeof v´ycˇ toveho typu zavis´ IJC — Jazyk C
203/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ Poznamky
ˇ e´ cyklu ve for Rozsah deklarace promenn for(int i=1; i<10; i++) { // zde plat´ ı i } Je chybou, kdyˇz je pˇr´ıkazem skoku pˇreskoˇcena inicializace ˇ e´ (pˇrekladaˇc to kontroluje). promenn Pozor na setjmp a longjmp
IJC — Jazyk C
204/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Typ reference Definice: T & x = Lhodnota_typu_T; Bl´ızke´ ukazatelum ˚ (ale neexistuje obdoba NULL) ´ an´ ´ ı parametru˚ odkazem Pouˇzitelne´ pro pˇredav Nelze vytvoˇrit: referenci na referenci (napˇr. T & & r), ´ je dovoleno, ale jen nepˇr´ımo Pozor: v sˇ ablonach referenci na bitova´ pole, ukazatele na reference, pole referenc´ı.
V´yhodou referenc´ı je jednoduchost pouˇzit´ı (na rozd´ıl od *ptr) ´ Poznamka: R-hodnotove´ reference Typ && IJC — Jazyk C
(C++11) 205/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Typ reference – pˇr´ıklady double x = 1.23456; double & xref = x; // Typick´ e pouˇ zit´ ı double & yref; extern int & zref;
// CHYBA! chyb´ ı inicializace // extern m˚ uˇ ze b´ yt bez inicializace
// Pˇ red´ an´ ı parametru odkazem: void Transpose(Matrix & m); // Vracen´ ı reference: int & f(param); // Pozor na to _co_ se vrac´ ı! f(p) = 1;
IJC — Jazyk C
// Vol´ an´ ı funkce
206/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Reference — chybna´ nebo netypicka´ pouˇzit´ı const int & i = 7; // Vytvoˇ r´ ı pomocnou promˇ ennou int & i = 7; // CHYBA! nelze pro nekonst. referenci float f = 3.14; const int & ir = f; // pomocn´ a_promˇ enn´ a = 3 ir = 5; // CHYBA! konstantu nelze zmˇ enit ´ Poznamka: Proˇc nelze pouˇz´ıt R-hodnotu s nekonstantn´ı referenc´ı: void incr( int& refint ) { refint++; } void g() { // pozor - toto nen´ ı C++ double d = 1; incr(d); // z´ aludn´ a chyba: nezmˇ en´ ı d ! } IJC — Jazyk C
207/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Typ bool ´ Booleovske´ literaly: false a true Implicitn´ı konverze bool ---> int true ---> 1 false ---> 0 Konverze cˇ ´ısel, v´ycˇ tu˚ a ukazatelu˚ na bool 0 ---> false jinak ---> true V´ysledek relaˇcn´ı operace je typu bool Pˇr´ıklad: bool test = false; test = (a > b); // bool test = 5; // int ---> bool IJC — Jazyk C
208/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ Operatory C++ podle priority ´ operatory ( ) [ ] -> :: . ! ~ + - ++ -- & * (Typ) sizeof new delete .* ->* * / % + << >> < <= > >= == != & ^ | && || ?: = *= /= %= += -= &= ^= |= <<= >>= , IJC — Jazyk C
asociativita → ← → → → → → → → → → → → ← ← → 209/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ Operatory C++ ´ operator :: .* ->* new delete static_cast, reinterpret_cast, const_cast, dynamic_cast
IJC — Jazyk C
popis ´ kvalifikator dereference ukazatele na cˇ len tˇr´ıdy pˇres objekt dereference ukazatele na cˇ len tˇr´ıdy pˇres ukazatel na objekt dynamicke´ vytvoˇren´ı objektu zruˇsen´ı objektu ´ ´ ı nove´ operatory pˇretypovan´
210/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ Operatory — pˇr´ıklady // alokace pamˇ eti oper´ atorem new: T *p = new T[10*n]; // dynamick´ a alokace pole T *p2 = new T(5); // dynamick´ a alokace objektu // uvolnˇ en´ ı pamˇ eti oper´ atorem delete: delete [] p; // uvolnˇ en´ ı pamˇ eti pole delete p2; // uvolnˇ en´ ı pamˇ eti objektu // alokace a ruˇ sen´ ı pole bajt˚ u: char *s = new char[100]; delete [] s; // char *s2 = static_cast
IJC — Jazyk C
211/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ Operator :: ´ ı promenn ˇ e: ´ Pˇr´ıstup ke globaln´ double x; void f() { int x; // lok´ aln´ ı x ::x = 3.1415926; // glob´ aln´ ı x } Explicitn´ı specifikace tˇr´ıdy: class T { public: int metoda(); // deklarace metody }; int T::metoda() { } // definice mimo tˇ r´ ıdu Specifikace prostoru jmen: prostor::identifik´ ator std::cin prostor::podprostor::identifik´ ator IJC — Jazyk C
212/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Standardn´ı konverze v C++ ´ pˇri Implicitn´ı konverze prob´ıhaj´ı automaticky (jsou-li nutne) ´ ı binarn´ ´ ıch operac´ı: vyhodnocovan´ Kaˇzd´y ’mal´y’ celoˇc´ıseln´y typ se konvertuje takto: typ konverze na metoda char int podle nastaven´ı unsigned char int dopln´ı nuly ´ signed char int rozˇs´ıˇr´ı znamenko short int stejna´ hodnota unsigned short unsigned int stejna´ hodnota enum int stejna´ hodnota bool int 0 nebo 1 Potom je kaˇzda´ hodnota operandu bud’ int (vˇcetneˇ long a ´ u) unsigned modifikator ˚ double, float nebo long double.
IJC — Jazyk C
213/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ı Standardn´ı konverze v C++ — pokraˇcovan´
1
ˇ ´ Je-li nekter´ y operand long double, je druh´y konvertovan na long double
2
Jinak, je-li operand double, konvertuje druh´y na double
3
Jinak, je-li operand float, konvertuje druh´y na float
4
Jinak, je-li operand unsigned long, konvertuje druh´y na unsigned long
5
Jinak, je-li operand long, konvertuje druh´y na long
6
Jinak, je-li operand unsigned, konvertuje druh´y na unsigned
7
Jinak, jsou oba operandy typu int
V´ysledek odpov´ıda´ typu obou operandu˚ po konverzi.
IJC — Jazyk C
214/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Konverze — pˇr´ıklady
´ Poznamka: ´ an´ ´ ı cˇ ´ısla int s cˇ ´ıslem unsigned muˇ Pˇri porovnav ˚ ze doj´ıt k (pro ˇ ´ ´ um: nekoho neoˇcekavan´ ym) problem ˚ int i = -1; unsigned u = 1234; if(i
IJC — Jazyk C
// sledujte varov´ an´ ı pˇ rekladaˇ ce // nevytiskne nic!
215/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Explicitn´ı konverze ´ ı programator ´ Explicitn´ı konverze uvad´ do textu programu ˇ (a pˇreb´ıra´ za neˇ veˇskerou odpovednost): (typ) v´ yraz typ(v´ yraz) static_cast
´ ı Explicitn´ı pˇretypovan´
double(int1)/int2 complex(3.14) int(’c’) static_cast
IJC — Jazyk C
216/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
extern "C" Moˇznost pouˇzit´ı funkc´ı z knihoven jazyka C, pˇr´ıpadneˇ jin´ych jazyku˚ (ASM, FORTRAN): extern "C" int f(int); extern "C" { int g(int); int h(int); }
´ Poznamky: Prostory jmen (namespace) ´ Makro __cplusplus definovano pˇrekladaˇcem IJC — Jazyk C
217/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Preprocesor ´ ı Je stejn´y jako v ISO C, je vhodne´ minimalizovat jeho pouˇz´ıvan´ ´ (protoˇze mame lepˇs´ı prostˇredky): lze nahradit za:
#define K1 10 const int K1 = 10; #define f(x)
(v´ yraz_x)
ˇ sinou nahradit za: lze vetˇ
inline int f(int x) { return v´ yraz_x; } pˇr´ıpadneˇ lze pouˇz´ıt genericke´ funkce: template
IJC — Jazyk C
218/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ı programu˚ Knihovny a sestavovan´ ´ Zakladn´ ı koncepty knihovna = mnoˇzina pˇreloˇzen´ych modulu˚ v jednom souboru (pˇr´ıpony: *.a, *.lib, *.so, *.dll) ´ ı) modul object file = pˇreloˇzen´y (binarn´ (pˇr´ıpony: *.o, *.obj) ´ ı programu = vytvoˇren´ı spustitelneho ´ sestavovan´ souboru spojen´ım modulu˚ a knihoven (program vola´ funkce ˇ z knihoven/jin´ych modulu˚ a ty mus´ı b´yt dostupne´ nejpozdeji ´ ı) v okamˇziku volan´ Typy sestaven´ı: ´ ren´ı programu staticke´ – pˇri vytvaˇ ˇ ı programu dynamicke´ – pˇri/po spuˇsten´ ´ Poznamky: relokace, Position Independent Code (PIC), linker, loader IJC — Jazyk C
219/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ souboru˚ Formaty
COFF, PE (Windows), ELF (POSIX), ... Typicka´ struktura souboru: hlaviˇcka – typ, obsah ´ sekce .text - kod sekce .rodata - konstanty sekce .data - inicializovana´ data, sekce .debug* - ladic´ı informace sekce .rel* - relokaˇcn´ı informace sekce .plt - tabulka pro dyn. sestaven´ı ...
´ Poznamka: V´ypis obsahu souboru: ˚ programy objdump, nm, readelf
IJC — Jazyk C
220/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ren´ı statick´ych knihoven Vytvaˇ
´ modulu˚ a index pro Staticke´ knihovny obsahuj´ı kod ´ ı zrychlen´ı sestavovan´ ´ rej´ı se specialn´ ´ ım programem (librarian). POSIX Vytvaˇ ´ r. pouˇz´ıva´ program ar – archivaˇ 1
2
3
IJC — Jazyk C
pˇreklad modulu: ˚ cc -c moduly.c vytvoˇren´ı knihovny: ar parametry knihovna.a moduly.o ´ Pozor – parametry jsou duleˇ ˚ zite! vytvoˇren´ı indexu: ranlib knihovna.a
221/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ren´ı sd´ılen´ych knihoven Vytvaˇ
´ modulu˚ a tabulky odkazu˚ obsahuj´ı kod ´ rej´ı se pˇrekladaˇcem, vytvaˇ 1 2
cc -c -fPIC moduly.c cc -shared -fPIC moduly.o -o knihovna.so
maj´ı pˇr´ıponu .so (shared object) nebo .DLL (Dynamically Linked Library) ´ nezavisl´ ´ ˇ ı v pamet ˇ ’ovem ´ mus´ı obsahovat kod y na um´ısten´ prostoru (PIC) ´ ı funkc´ı pˇres PLT (Procedure Linkage Table) ELF: volan´ ´ Poznamka: libtool
IJC — Jazyk C
222/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ı programu Sestavovan´
pˇrekladaˇc (compiler): ´ vloˇz´ı do pˇreloˇzeneho modulu informace potˇrebne´ pro sestaven´ı (exportovane´ symboly, nedefinovane´ symboly, relokaˇcn´ı informace, ...)
sestavovac´ı program (linker): ´ modulu˚ do adresoveho ´ ˇ um´ıst´ı kod prostoru (nekdy je nutna´ relokace), pˇrep´ısˇ e odkazy skuteˇcn´ymi adresami funkc´ı (pokryt´ı odkazu) ˚
ˇ c (loader): zavadeˇ ˇ ı programu zajist´ı jeho naˇcten´ı do pameti ˇ pˇri spuˇsten´ a pˇr´ıpadne´ dynamicke´ sestaven´ı
IJC — Jazyk C
223/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Staticke´ sestaven´ı
´ vˇsech funkc´ı v´ysledn´y program obsahuje kod typicky se sestavuj´ı cele´ moduly z knihoven Sestavovac´ı programy: gcc -static (implicitneˇ sestavuje dyn.) ld (POSIX), tlink (BC), ...
V´yhody: ´ ´ (jeden soubor) nezavislost programu na knihovnach
Nev´yhody: ˇ s´ı spustitelne´ soubory, vetˇ ´ knihoven nelze sd´ılet kod
IJC — Jazyk C
224/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
prog.c
m1.c
m2.c
m3.c
m4.c
prog.o
m1.o
m2.o
m3.o
m4.o
cc −c
ar
crt1.o
libc.a
libtest.a
ld
program
IJC — Jazyk C
225/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Dynamicke´ sestaven´ı
´ funkc´ı, program neobsahuje kod ˇ ı programu k sestaven´ı dojde aˇz po spuˇsten´ ld.so = dynamic linker/loader V´yhody: ´ moˇznost nezavisl e´ aktualizace knihoven, menˇs´ı programy, ´ sd´ılen´ı kodu knihoven
Nev´yhody: pomalejˇs´ı start procesu, ´ zavislost programu na dalˇs´ıch souborech ´ zavislost na verz´ıch knihoven
IJC — Jazyk C
226/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
prog.c
m1.c
m2.c
gcc −c
m3.c
m4.c
gcc −c −fPIC
prog.o
m1.o
m2.o
m3.o
m4.o
gcc −shared
libc.so
libtest.so
ld.so gcc
program
./program
process
IJC — Jazyk C
227/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Pouˇzit´ı knihoven Pˇr´ıklad: Program s knihovnou libtest.a gcc -o program -static m1.c m2.c -L. -ltest Pˇr´ıklad: Program s knihovnou libtest.so gcc -o program m1.c m2.c -L. -ltest ´ Poznamky: ˇ ı knihoven! Pozor na um´ısten´ Lze kombinovat staticke´ i dynamicke´ Poˇrad´ı argumentu˚ je v´yznamne´ (POSIX) cc prog.c library1.a library2.a library1.a (z knihoven se vyb´ıraj´ı jen potˇrebne´ symboly, pˇri cyklick´ych ´ ´ dvakrat) ´ zavislostech mus´ıme knihovnu uvest ´ Problemy: DLL hell, nekompatibilita verz´ı knihoven, ... IJC — Jazyk C
228/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ı Pouˇzit´ı knihoven – pokraˇcovan´ Program ldd(1) – v´ypis sd´ılen´ych knihoven ˇ ı sd´ılen´ych knihoven v adresaˇ ´ rove´ struktuˇre (/lib, Um´ısten´ /usr/lib, ...) ´ Jmena souboru˚ se sd´ılen´ymi knihovnami: /usr/lib/libJMENO.so.7.8.9 -- real name /usr/lib/libJMENO.so.7 -- so name (symlink) /usr/lib/libJMENO.so -- linker name (symlink) ´ ´ ı: Parametrizace dynamickeho sestavovan´ ´ re, ve kter´ych jsou hledany ´ LD_LIBRARY_PATH – adresaˇ sd´ılene´ knihovny ˇ LD_PRELOAD – moˇznost nahradit nekter e´ funkce jin´ymi z pˇrednostneˇ sestaven´ych knihoven (dalˇs´ı informace viz man ld.so) ´ ı: /etc/ld.so.cache, ldconfig(8) Zrychlen´ı sestavovan´ IJC — Jazyk C
229/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Program make ˇreˇs´ı zavislosti ´ ´ ren´ı programu˚ pˇri vytvaˇ ´ a´ provad ´ en´ ˇ ı akc´ı podle zadan´ych pravidel uspoˇrad ˇ souboru: pouˇzije se cˇ as posledn´ı zmeny ˇ ´ pokud (ˇcas c´ıle < cˇ as nekter eho zdroje), provede akci, ktera´ vytvoˇr´ı nov´y c´ılov´y soubor Pˇr´ıklad: Pravidla v souboru Makefile: program: modul1.o modul2.o modul1.o: modul1.c modul2.o: modul2.c ´ Poznamky: GNU make: implicitn´ı pravidla a akce make CFLAGS=-O2 IJC — Jazyk C
230/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Pˇr´ıklad ˇ ych Pouˇzit´ı promenn´ CFLAGS = -O2 -Wall -std=c99 CXXFLAGS = -g PROGS = program1 program2
# ?=
all: $(PROGS) program1: program1.c $(CC) $(CFLAGS) -o $@ $< program2: program2.c $(CC) $(CFLAGS) -o $@ $< clean: rm -f $(PROGS) ### pozor na
IJC — Jazyk C
231/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Implementace GNU make, BSD make Alternativy k make Jam, ... ´ ı zavislost´ ´ Automaticke´ generovan´ ı gcc -MM *.cc >depend vloˇzen´ı do Makefile: -include depend ´ ı Makefile Programy pro generovan´ GNU Autoconf ./configure; make; make install CMake qmake – Qt toolkit imake – X Window System IJC — Jazyk C
232/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
V´ykonnost programu˚ (performance) ´ ˇ neoptimalizovat Zakladn´ ı pravidlo: radeji ˇ Pravidlo 90 — 10 (nekdy i 98—2) ´ ı kritick´ych m´ıst v programech: Hledan´ ´ ej´ ˇ ıc´ı) Odhad (ˇcasto zavad ˇ ren´ı cˇ asu: Meˇ pˇr´ıkaz time, funkce time(), clock(), instrukce RDTSC, performance counters, ... Pouˇzit´ı programu˚ typu ’profiler’ (gprof, valgrind, ...). ´ ı pamet ˇ ’ove´ naroˇ ´ cnosti (memprof, ...) Zjiˇst’ovan´ ´ Poznamka: Pˇr´ıliˇs mnoho souvislost´ı — cˇ asto pˇripom´ına´ cˇ ernou magii ´ ˇ ı, podsystemu ´ ´ ı pameti ˇ Vliv vyrovnavac´ ıch pamet´ virtualn´ ´ (v´ypadky stranek, TLB miss), ... IJC — Jazyk C
233/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
ˇ ´ cnost Casov a´ naroˇ Strategie: Pouˇz´ıt lepˇs´ı algoritmy/datove´ struktury Zapnout optimalizace pˇri pˇrekladu (gcc -O3) ´ upravy ´ ı kodu: ´ Provest kritick´ych cˇ ast´ ´ pˇresun invariantu, ˚ vyhodnocen´ı spoleˇcn´ych podv´yrazu, ˚ pouˇzit´ı jin´ych operac´ı(a<<=2), rozvinut´ı cyklu, ˚ uloˇzit cˇ asto potˇrebne´ v´ysledky (cache), ´ an´ ´ ı vstupu/v´ystupu, vyrovnav ´ ı alokace mal´ych objektu, specialn´ ˚ pˇredem vypoˇc´ıtane´ hodnoty (tabulky), ´ ı s menˇs´ı pˇresnost´ı, poˇc´ıtan´ zlepˇsen´ı lokality odkazu, ˚ ´ ı do jineho ´ pˇrepsan´ jazyka (asm) ...
´ Poznamka: Neoptimalizujte co nema´ smysl IJC — Jazyk C
234/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
ˇ ’ova´ naroˇ ´ cnost Pamet ˇ ’ova´ naroˇ ´ cnost Souvislost: cˇ asova´ x pamet Strategie: pouˇz´ıvat co nejmenˇs´ı datove´ typy ´ an´ ´ ı, bitfields radeji ˇ nepouˇz´ıvat) (pozor na zarovnav ´ neukladat co lze snadno znovu vypoˇc´ıtat ´ volit vhodne´ datove´ formaty ´ cna) ´ (napˇr. de/komprese muˇ ˚ ze b´yt cˇ asoveˇ naroˇ ˇ ’i a cache velikost pamet ´ Poznamky: lokalita odkazu, ˚ vliv CPU cache ´ rekurze (pˇr´ıklad: Ackerman) problem memory profiler: valgrind/cachegrind, ... IJC — Jazyk C
235/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Pˇrenositelnost (portability) ´ Pˇrenositeln´y program lze pˇreloˇzit na v´ıce ruzn´ ˚ ych platformach (napˇr´ıklad UNIX, Linux/x86, Linux/PPC, Windows, MacOS X, ...) obvykle se odhal´ı v´ıce chyb ´ cnejˇ ˇ s´ı na dodrˇzovan´ ´ ı standardu˚ naroˇ ´ ´ nevyuˇz´ıvat speciality platforem, platformoveˇ zavisl´ y kod ´ davat do samostatn´ych modulu˚ pozor na implementac´ı definovane´ vlastnosti prostˇred´ı ´ ı, little/big (velikost int, poˇrad´ı vedlejˇs´ıch efektu, ˚ zarovnan´ endian, bitfields, un/signed char, ...) ´ na v´ymenu ˇ dat (pozor na CRLF) pouˇz´ıvat textove´ formaty ...
IJC — Jazyk C
236/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ı Pˇrenositelnost – pokraˇcovan´
Pˇrenositelne´ (multiplatform) knihovny – podstatneˇ ˇ ı psan´ı pˇrenositeln´ych programu˚ (pˇr´ıklady: SDL, usnadnuj´ Qt, WxWidgets, ...). ´ Vhodne´ v´yvojove´ nastroje (GCC, make, ...). ”Cross development”– editace/pˇreklad/sestaven´ı neprob´ıha´ na c´ılove´ platformeˇ (duleˇ ˚ zite´ pˇredevˇs´ım pro ´ ”embedded”systemy). Automaticka´ detekce konfigurace pˇri pˇrekladu – GNU autoconf: configure; make; make install (GNU build system: Automake, Autoconf, Libtool)
IJC — Jazyk C
237/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Konverzn´ı programy
Programy pro pˇreklad z jin´ych jazyku˚ do C: p2c – Pascal f2c – Fortran ˇ ˇ y assembler Nekter e´ jazyky pouˇz´ıvaj´ı C jako vysokourov ´ nov´ (pojem ”translator”, pˇr´ıklady: Cfront C++, Modelica) ... ´ Poznamka: + podpurn ˚ e´ knihovny
IJC — Jazyk C
238/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ reviz´ı Programy pro spravu Tyto programy (Revision Control, Version Control Systems) ´ ı zmen ˇ pˇri v´yvoji programu. dovoluj´ı sledovan´ ˚ Pˇr´ıklady: SCCS (Bell-labs, 1980), RCS (198x), ... Klient-server: CVS (1986), Subversion (2000), ... ´ Git, GNU arch, Bazaar, Monotone, ... Distribuovane: Princip: archiv souboru˚ (repository), operace vloˇzen´ı (commit, checkin), ˇ (checkout), operace v´yberu ´ a´ pouze zmeny ˇ (algoritmus diff), uklad ˇ pˇr´ıstup k libovolne´ verzi v historii zmen, ˇ moˇznost vetven´ ı (branching), ´ ru. je moˇzn´y souˇcasn´y pˇr´ıstup v´ıce v´yvojaˇ ˚ IJC — Jazyk C
239/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Subversion Jednoduch´y uvod (soubory, ne client-server): ´ svnadmin create svnrep
## zaloˇ zen´ ı repozit´ aˇ re
svn mkdir file:///home/xjmeno99/svnrep/projekt cd /home/xjmeno99/cesta/projekt svn import file:///home/xjmeno99/svnrep/projekt svn checkout file:///home/xjmeno99/svnrep ## editujeme soubory v adres´ aˇ ri ’projekt’ svn commit
## zap´ ıˇ se zmˇ eny, ++cislorevize
svn update -r cislorevize
## n´ avrat k zadan´ e revizi
IJC — Jazyk C
240/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Git ´ ´ velk´ymi projekty (Linux, ...) Distribuovan´y system, pouˇz´ıvan ´ ı repozitaˇ ´ r): Jednoduch´y uvod (lokaln´ ´ mkdir adresar cd adresar git init
## zaloˇ zen´ ı (pr´ azdn´ eho) repozit´ aˇ re
## editujeme soubory v adres´ aˇ ri a podadres´ aˇ r´ ıch git add . ## pˇ rid´ ame soubory do sledovan´ ych git commit -a ## zap´ ıˇ se zmˇ eny (TODO: -m) git tag -a -m "Brand New Release" 1.0 ## editujeme soubory v adres´ aˇ ri a podadres´ aˇ r´ ıch git checkout 1.0 ## n´ avrat gitk ## GUI pro sledov´ an´ ı reviz´ ı IJC — Jazyk C
241/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ ı Git – pokraˇcovan´ ´ y repozitaˇ ´ r): Jednoduch´y uvod (vzdalen´ ´ git clone host:/cesta/adresar ## staˇ zen´ ı repozit´ aˇ re cd adresar ## editujeme soubory v adres´ aˇ ri a podadres´ aˇ r´ ıch git add . ## pˇ rid´ ame soubory do sledovan´ ych git commit -a ## zap´ ıˇ se zmˇ eny (TODO: -m) git push ## z´ apis na server ## editujeme soubory v adres´ aˇ ri a podadres´ aˇ r´ ıch git pull
## staˇ zen´ ı aktualizace ## moˇ zn´ e kolize! # a dalˇ sı ´ (rebase,stash,...) viz literatura Obsah souboru˚ je (po commit) uloˇzen na alesponˇ 2 m´ıstech: ´ e´ — repo2-lokaln´ ´ ı — soubory repo1-vzdalen IJC — Jazyk C
242/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
Pˇr´ıklady API
ˇ eˇ vazan´ ´ Jednoduch´y pˇr´ıklad: dlist.h – dvojsmern y seznam (+varianty: Linux lists) Knihovny: ´ ı s (tem ´ eˇ ˇ r) libovolnou pˇresnost´ı GMP – poˇc´ıtan´ zlib, libbzip2 – komprese dat libpng, libgd, SDL, OpenGL – grafika libsnd, libvorbis, OpenAL – zvuk GSL, atlas, BLAS, LAPACK – numericke´ v´ypoˇcty ´ ı v´yrazy regex – regularn´ ˇ y jazyk Scheme guile – vestaven´
Plug-in, komponenty: CORBA, XPCOM, ...
IJC — Jazyk C
243/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ Bezpeˇcnost – zaklady
´ typu ”buffer overflow”(zasobn´ ´ Problem ık, heap, ...) – je nutne´ dobˇre oˇsetˇrit vstupy ´ ”temporary file creation”– pozor na postup Problem ´ ren´ı jmen doˇcasn´ych souboru˚ vytvaˇ ... ... ... Pˇr´ıklady ´ steˇ u SUID programu˚ a serveru˚ Velmi duleˇ ˚ zite´ zvlaˇ
IJC — Jazyk C
244/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
UCS – pˇrehled ISO 10646, Universal Character Set (UCS), 231 , ”Planes” ´ (U+0041) + jmeno ´ kod znaku (”Latin capital letter A”) Rozsah U+0000 – U+00FF odpov´ıda´ ISO 8859-1 (Latin-1) Unicode je kompatibiln´ı s UCS, nav´ıc algoritmy, atd. ´ ´ ı UCS-2, UCS-4, UTF-8, UTF-16, ... Kodov an´ Kombinace znaku˚ (”combining char”, napˇr. rˇ = ˇ r) ´ Urovn eˇ implementace (Level 1-3) ´ Problemy: ´ ´ ı, BOM ruzn an´ ˚ a´ kodov ´ u˚ pro jeden znak: moˇznost v´ıce kod U+00B5 MICRO SIGN = U+03BC GREEK SMALL LETTER MU ´ Poznamky: International Components for Unicode (ICU), Pango, Qt IJC — Jazyk C
245/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ UTF-8 – zaklady UTF = ”UCS Transformation Format” UTF-8 (autor: Ken Thompson, kolem 1992) U00000000 U00000080 U00000800 U00010000 U00200000 U04000000
-
U0000007F: U000007FF: U0000FFFF: U001FFFFF: U03FFFFFF: U7FFFFFFF:
0xxxxxxx 110xxxxx 1110xxxx 11110xxx 111110xx 1111110x
10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx*3 10xxxxxx*4 10xxxxxx*5
´ akceptuje pouze minimaln´ ´ ı Z bezpeˇcnostn´ıch duvod u˚ dekoder ˚ nutnou reprezentaci. UNICODE definuje normalizovane´ formy (NFD,NFC,...).
IJC — Jazyk C
246/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
UTF-8 – pouˇzit´ı Poˇzadavky: ´ System: libc + vygenerovana´ lokalizaˇcn´ı data (locale -a) LC_* nastaveno na UTF-8 (locale; locale charmap) ´ Terminal/editor pracuj´ıc´ı s UTF-8 Pouˇzit´ı setlocale(LC_CTYPE, "") ´ ? Pˇrekladaˇc pracuj´ıc´ı s lokalizacemi UTF-8 (literaly) ? wchar_t, mbs, wcs — pˇr´ımo pouˇzitelne´ jen pokud je ´ definovano makro __STDC_ISO_10646__ s hodnotou yyyymmL ´ ı: Moˇznosti zpracovan´ ´ ı i v´ystup v UTF-8 Vstup, zpracovan´ ´ ı v wchar_t Vstup/v´ystup UTF-8, zpracovan´ ´ Nastroje: Pouˇzit´ı libc a lokalizace ´ eˇ rychlejˇs´ı) Vlastn´ı implemantace (potencialn IJC — Jazyk C
247/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
UTF-8 – pouˇzit´ı
Konverze: size_t wcstombs(char *dest, const wchar_t *src, size_t n); size_t mbstowcs(wchar_t *dest, const char *src, size_t n); Thread-safe: wcsrtombs, mbsrtowcs ´ ´ ´ ı: Funkce nezavisl e´ na lokalizaci a kodov an´ strcpy strcat strcmp strstr ´ ´ ´ ı: Funkce zavisl e´ na lokalizaci ale ne na kodov an´ strcoll strxfrm
IJC — Jazyk C
248/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
UTF-8 – pouˇzit´ı
´ ˇretezce: ˇ Delka poˇcet bajtu˚ (pro alokaci) ´ potˇrebne) ´ mbstowcs(NULL,s,0) poˇcet znaku˚ (malo poˇcet pozic na displeji (wcwidth,wcswidth) Editace: ´ an´ ´ ı znaku vklad ruˇsen´ı znaku pozice znaku na obrazovce (ˇc´ınske´ zab´ıraj´ı 2 pozice)
IJC — Jazyk C
249/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
UTF-8 – pˇr´ıklady
´ Zakladn´ ı pouˇzit´ı nevyˇzaduje zapnut´ı lokalizace: #include <stdio.h> int main() { printf("Hello, UTF-8 world: ˇ eˇ sˇ cˇ rˇ z´ y´ a´ ı´ e \n"); return 0; }
IJC — Jazyk C
250/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
UTF-8 – pˇr´ıklady Tisk sˇ irok´ych znaku: ˚ #include <stdio.h> #include
IJC — Jazyk C
251/252
´ Uvod ISO C libc C99 Debug C++ Link Opt .
´ er ˇ – poznamky ´ Zav a souvislosti
Free Software, Projekt GNU Licence (GPL, LGPL, BSD, MIT, MPL, Apache, ...) ´ WWW stranka s odkazy ... Co bude u zkouˇsky
IJC — Jazyk C
252/252