Odvozen´e a strukturovan´e typy dat ˇ Petr Saloun ˇ katedra informatiky FEI VSB-TU Ostrava
14. listopadu 2011
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
1 / 20
Odvozen´e a strukturovan´e typy dat
z´akladn´ı datov´y typ – souˇc´ast´ı normy jazyka, preprocesor – pouˇzit´ı bezparametrick´ych maker, radˇeji vol´ıme konstanty odvozen´e datov´e typy t y p e d e f
< i d e n t i f i e r >; vlastn´ı definice datov´eho typu strukturovan´e datov´e typy struct a union vlastn´ı definice struktury.
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
2 / 20
Sloˇzitˇejˇs´ı typov´e deklarace deklarace typ jm´ eno; typ jm´ eno[]; typ jm´ eno[3]; typ typ typ typ typ typ typ typ
*jm´ eno; *jm´ eno[]; *(jm´ eno[]); (*jm´ eno)[]; jm´ eno(); *jm´ eno(); *(jm´ eno()); (*jm´ eno)();
v´yznam typ, (otevˇren´e) pole typu typ, pole (pevn´e velikosti) tˇr´ı poloˇzek typu typ (jm´ eno[0], jm´ eno[1], jm´ eno[2]), ukazatel na typ, (otevˇren´e) pole ukazatel˚ u na typ, (otevˇren´e) pole ukazatel˚ u na typ, ukazatel na (otevˇren´e) pole typu typ, funkce vracej´ıc´ı hodnotu typu typ, funkce vracej´ıc´ı ukazatel na hodnotu typu typ, funkce vracej´ıc´ı ukazatel na hodnotu typu typ, ukazatel na funkci, vracej´ıc´ı typ.
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
3 / 20
Obecn´y postup – zevnitˇr ven. Postup pro spr´avnou interpretaci definice: 1
zaˇcnˇeme u identifik´atoru a hledejme vpravo kulat´e nebo hranat´e z´avorky (jsou–li nˇejak´e);
2
interpretujme tyto z´avorky a hledejme vlevo hvˇezdiˇcku;
3
pokud naraz´ıme na pravou z´avorku (libovoln´eho stupnˇe vnoˇren´ı), vrat’me se a aplikujme pravidla jedna a dva pro vˇse mezi z´avorkami;
4
aplikujme specifikaci typu.
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
4 / 20
Pˇr´ıklad sloˇzitˇejˇs´ı typov´e konstrukce
char 7
∗( 6
∗( 4
∗ var ) 2 1
()) [10]; 3 5
1
identifik´ator var je deklarov´an jako
2
ukazatel na
3
funkci vracej´ıc´ı
4
ukazatel na
5
pole deseti prvk˚ u, kter´e jsou
6
ukazateli na
7
hodnoty typu char.
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
5 / 20
Pˇr´ıklady sloˇzitˇejˇs´ı typov´e konstrukce – 2 unsigned i n t ∗ ( ∗ const ∗name [ 5 ] [ 1 0 ] ) ( v o i d ) ; Identifik´ator name je dvourozmˇern´ym polem o celkem pades´ati prvc´ıch. Prvky tohoto pole jsou ukazateli na ukazatele, kter´e jsou konstantn´ı. Tyto konstantn´ı ukazatele ukazuj´ı na typ funkce, kter´a nem´a argumenty a vrac´ı ukazatel na hodnotu typu unsigned int. double
( ∗ v a r ( double ( ∗ ) [ 3 ] ) ) [ 3 ]
Funkce vrac´ı ukazatel na pole tˇr´ı hodnot typu double. Jej´ı argument, stejnˇe jako n´avratov´a hodnota, je ukazatel na pole tˇr´ı prvk˚ u typu double. Argument funkce var je konstrukce, kter´a se naz´yv´a abstraktn´ı deklarace. Obecnˇe se jedn´a o deklaraci bez identifik´atoru. Pro zjednoduˇsen´ı a zpˇrehlednˇen´ı abstraktn´ıch deklarac´ı se pouˇz´ıv´a typedef konstrukce.
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
6 / 20
Pˇr´ıklady abstraktn´ı deklarace typ˚ u
deklarace int * int *[3] int (*)[5] int *() int (*) (void) int (*const []) (unsigned int, ...)
v´yznam ukazatel na typ int, pole tˇr´ı ukazatel˚ u na int, ukazatel na pole pˇeti prvk˚ u typu int, fce bez specifikace arg. vracej´ıc´ı uk. na int, uk. na fci nemaj´ıc´ı argumenty vracej´ıc´ı int, uk. na nespecifikovan´y poˇcet konst. uk. na fce. z nichˇz kaˇzd´a m´a prvn´ı argument unsigned in a nespecifikovan´y poˇcet dalˇs´ıch argument˚ u.
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
7 / 20
V´yˇctov´y typ
umoˇzn ˇuje definovat konstanty v´yˇctov´eho typu. enum [ t a g ] {enum− l i s t } [ d e c l a r a t o r ] ; enum je kl´ıˇcov´e slovo, zahajuj´ıc´ı definici hodnot v´yˇctov´eho typu; tag je nepovinn´a visaˇcka“, vyuˇz´ıvan´a zejm´ena ve stylu K&R ” jazyka C, s konstrukc´ı typedef ˇcetnost jej´ıho pouˇzit´ı kles´a; enum-list je seznam konstant v´yˇctov´eho typu s moˇznou explicitnˇe pˇriˇrazenou hodnotou, viz pˇr´ıklad d´ale, jinak nab´yv´a prvn´ı konstanta v´yˇctov´eho typu hodnoty nula, druh´a hodnoty jedna, . . . , kaˇzd´y n´asledn´ık m´a hodnotu o jedniˇcku vyˇsˇs´ı, neˇz jeho pˇredch˚ udce; declarator je nepovinn´y seznam promˇenn´ych dan´eho typu enum.
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
8 / 20
Pouˇzit´ı konstant v´yˇctov´ych typ˚ u – enum use.c t y p e d e f enum { Back = 8 , Tab = 9 , Esc = 2 7 , E n t e r = 1 3 , Down = 0 x0150 , L e f t = 0 x014b , R i g h t = 0 x014d , Up = 0 x0148 , NUL = 0 x0103 , S h i f t T a b = 0 x 0 1 0 f , Del = 0 x0153 , End = 0 x 0 1 4 f , Home = 0 x0147 , I n s = 0 x0152 , PgDn = 0 x0151 , PgUp = 0 x0149 } key t ; i n t znak ; ... e l s e i f ( ( znak == L e f t ) | | ( znak == Back ) ) ... e l s e i f ( znak == E n t e r ) ... e l s e i f ( znak == Esc ) ... else i f . . . ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
9 / 20
Typ struktura
s t r u c t [< s t r u c t −t y p e −name>] { [< t y p e > < v a r i a b l e −name [ , v a r i a b l e −name , . . . ] > ] ; [< t y p e > < v a r i a b l e −name [ , v a r i a b l e −name , . . . ] > ] ; ... } [< s t r u c t u r e v a r i a b l e s >] ; . teˇcka“ – selektor struktury (z´aznamu), napˇr. u promˇenn´e. ” -> – selektor struktury, prostˇrednictv´ım ukazatele.
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
10 / 20
Pˇr´ıklad struktur – struct01 .c – I
typedef s t r u c t { f l o a t r e , im ; } c o m p l e x ; complex c i s l o , i m j e d n o t k a = {0 , 1}; c i s l o . re = 12.3456; c i s l o . im = −987.654; p r i n t f ( ” r e = %10.5 f im = %10.5 f \n” , i m j e d n o t k a . r e , i m j e d n o t k a . im ) ; p r i n t f ( ” r e = %10.5 f im = %10.5 f \n” , c i s l o . r e , c i s l o . im ) ;
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
11 / 20
Pˇr´ıklad struktur – struct01 .c – II typedef struct { int e v c i s l o ; char n a z e v [ ZNAKU NAZEV + 1 ] ; int na sklade ; f l o a t cena ; } vyrobek ; t y p e d e f v y r o b e k z b o z i [ POLOZEK ZBOZI ] ; v y r o b e k a = { 8 7 6 5 , ” n a z e v z b o z i na s k l a d e ” , 100 , 1 2 3 . 9 9 } ; vyrobek ∗ ppolozky ; ... p p o l o z k y −> e v c i s l o = 1 ;
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
12 / 20
Pˇr´ıklad struktur – struct01 .c – III polozky [ 0 ] . e v c i s l o = 0; s t r c p y ( p o l o z k y [ 0 ] . nazev , ” p o l o z k a c i s l o 0 ” ) ; polozky [ 0 ] . na sklade = 20; polozky [ 0 ] . cena = 4 5 . 1 5 ;
ppolozky = polozky + 1; p p o l o z k y −> e v c i s l o = 1 ; /∗ ( ∗ p p o l o z k y ) . e v c i s l o = 1 ; ∗ s t r c p y ( p p o l o z k y −>nazev , ” p o l o z k a c i s l o 1 ” ) ; p p o l o z k y −>n a s k l a d e = 1 2 3 ; p p o l o z k y −>c e n a = 9 9 4 5 . 1 5 ; p r i n t f (FORMAT VYROBEK, p r i n t f (FORMAT VYROBEK, p o l o z k y [ 0 ] . cena p r i n t f (FORMAT VYROBEK, p p o l o z k y −>cena ,
a . e v c i s l o , a . n a s k l a d e , a . cen polozky [ 0 ] . e v c i s l o , polozky [ 0 , polozky [ 0 ] . nazev ) ; p p o l o z k y −>e v c i s l o , p p o l o z k y −> p p o l o z k y −>n a z e v ) ;
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
13 / 20
Pouˇzit´ı struktur – v´ystup struct01 .c
re = 0 . 0 0 0 0 0 im re = 1 2 . 3 4 5 6 0 im c i s l o : 8765 p o c e t : cislo : 0 pocet : cislo : 1 pocet :
= 1.00000 = −987.65399 100 c e n a : 1 2 3 . 9 9 n a z e v : n a z e v z b o z i 20 c e n a : 45.15 nazev : polozka c i s 123 c e n a : 9 9 4 5 . 1 5 n a z e v : p o l o z k a c i s
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
14 / 20
Pˇr´ıklad struktury FILE * – datov´e proudy
Typ FILE, definice v hlaviˇckov´em souboru stdio.h je: typedef s t r u c t { short level ; unsigned flags ; char fd ; unsigned char h o l d ; short bsize ; unsigned char ∗ b u f f e r , ∗ c u r p ; unsigned istemp ; short token ; } FILE ;
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
15 / 20
Ne´upln´a deklarace struktur
struct A; /∗ n e u p l n a ∗/ s t r u c t B { s t r u c t A ∗ pa } ; s t r u c t A { s t r u c t B ∗ pb } ; ˇ sen´ı je moˇzn´e d´ıky ukazateli – jeho velikost je zn´ama, nikoli velikost Reˇ struktury, na kterou ukazuje.
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
16 / 20
Typ union
union [< union t y p e name>] { < v a r i a b l e names> ; ... } [< union v a r i a b l e s >] ; Syntaxe jako struct. S´emantika (!) – z poloˇzek unie lze pouˇz´ıvat v jednom okamˇziku pouze jednu. Ostatn´ı maj´ı nedefinovanou hodnotu. Realizace: pamˇet’ov´e m´ısto, vyhrazen´e pro unii je tak velik´e, aby obs´ahlo jedinou (pamˇet’ovˇe nejvˇetˇs´ı) poloˇzku. Je na program´atorovi, pracuje–li s prvkem unie, kter´y je urˇcen spr´avnˇe ˇci nikoliv.
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
17 / 20
Bitov´a pole
Bitov´e pole je cel´e ˇc´ıslo, um´ıstˇen´e na urˇcen´em poˇctu bit˚ u. Tyto bity tvoˇr´ı souvislou oblast pamˇeti. Bitov´e pole m˚ uˇze obsahovat v´ıce celoˇc´ıseln´ych poloˇzek. M˚ uˇzeme vytvoˇrit bitov´e pole tˇr´ı tˇr´ıd: 1
prost´e bitov´e pole,
2
bitov´e pole se znam´enkem,
3
bitov´e pole bez znam´enka.
Bitov´a pole m˚ uˇzeme deklarovat pouze jako ˇcleny struktury ˇci unie. V´yraz, kter´y nap´ıˇseme za identifik´atorem poloˇzky a dvojteˇckou, pˇredstavuje velikost pole v bitech.
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
14. listopadu 2011
18 / 20
Struktura ftime detailnˇe. struct ftime { unsigned f t unsigned f t unsigned f t unsigned f t unsigned f t unsigned f t };
tsec min hour day month year
: : : : : :
5; 6; 5; 5; 4; 7;
/∗ /∗ /∗ /∗ /∗ /∗
Two s e c o n d s Minutes Hours Days Months Year − 1980
ˇ ˇ Petr Saloun (katedra informatiky FEI VSB-TU Ostrava) Odvozen´ e a strukturovan´ e typy dat
∗/ ∗/ ∗/ ∗/ ∗/ ∗/
14. listopadu 2011
19 / 20