-
Slo╛kou struktury m∙╛e b²t i bitovΘ pole. BitovΘ pole je celoΦφselnß slo╛ka
o dΘlce 1 a╛ 32 bit∙. DΘlku bitovΘho pole a voliteln² identifikßtor specifikujeme
nßsledovn∞:
specifikßtor_typu
ident_bitovΘho_pole:╣φ°ka;
kde specifikßtor_pole je char nebo int (nebo jejich
bezznamΘnkovΘ verze). JednotlivΘ bity jsou v danΘm slov∞ p°id∞lovßny od
nejni╛╣φho po nejvy╣╣φ bit. V²raz ╣φ°ka nelze vynechat a musφ vΘst
na celoΦφselnou konstantu v rozsahu 1 a╛ 32. Pokud v deklaraci bitovΘho
pole nenφ uveden identifikßtor, je dan² poΦet bit∙ blokovßn a toto pole
je dßle nep°φstupnΘ. Tφmto zp∙sobem je mo╛nΘ vytvß°et nejr∙zn∞j╣φ masky
(nap°. pro hardwarovΘ registry), v nich╛ n∞kterΘ bity nemajφ v²znam.
Bitovß pole je mo╛no deklarovat pouze ve strukturßch, svazech a t°φdßch.
Struktury mohou obsahovat jakoukoli kombinaci bitov²ch polφ a "nebitov²ch"
typ∙. K jejich zp°φstup≥ovßnφ se pou╛φvajφ tytΘ╛ selektory jako pro jinΘ
slo╛ky struktury.
-
Svazy odpovφdajφ zßznam∙m s variantnφ Φßstφ. Svaz je odvozen² typ, kter²
mß mnoho syntaktick²ch a funkΦnφch vlastnostφ struktur. Hlavnφm rozdφlem
mezi strukturou a svazem je to, ╛e ve svazu m∙╛e b²t v dan² Φasov² okam╛ik
"aktivnφ" pouze jedna jeho slo╛ka. DΘlka svazu je tedy dßna dΘlkou jeho
nejv∞t╣φ slo╛ky. V kter²koli okam╛ik je mo╛nΘ uchovat hodnotu pouze jednΘ
jeho slo╛ky.
union TSvaz {
ing i;
double d;
char ch;
} mu, *muptr = μ
Prom∞nnß mu typu TSvaz m∙╛e b²t pou╛ita pro uchovßnφ
4 slabikovΘho celΘho Φφsla, 8 slabikovΘho reßlnΘho Φφsla nebo jednoslabikovΘho
znaku, ale v dan² okam╛ik v╛dy pouze jednoho z nich.
-
Barva zobrazovan²ch znak∙ a barva pozadφ znak∙ (v konzolovΘ aplikaci) se
m∙╛e takΘ zadßvat funkcφ
textattr (hlaviΦkov² soubor conio.h).
Parametr tΘto funkce je mo╛no vyjßd°it jako bitovΘ pole (4 bity barva znaku,
3 bity barva pozadφ a 1 bit blikßnφ; blikßnφ je mo╛no pou╛φvat pouze v
DOSu - v okn∞ konzolovΘ aplikace je po╛adavek na blikßnφ znak∙ ignorovßn).
Na tyto bity se v n∞kter²ch p°φpadech m∙╛eme takΘ dφvat jako na jedinou
hodnotu, kterΘ °φkßme atribut znaku. Pro spojenφ obou typ∙ pou╛ijeme svaz.
Je to ukßzßno v nßsledujφcφm programu.
union barva {
unsigned char
atribut;
struct {
unsigned popredi : 4;
unsigned pozadi : 3;
unsigned blikani : 1;
} slozky;
};
int main(int argc,
char **argv)
{
barva b;
b.slozky.blikani
= 1;
b.slozky.pozadi
= BLUE;
b.slozky.popredi
= GREEN;
textattr(b.atribut);
cprintf("Zkou╣ka
barvy\n\r");
return 0;
}
Vidφme, ╛e s prom∞nnou b zpoΦßtku pracujeme tak, ╛e se odkazujeme
na jejφ slo╛ky a potom ji pou╛φvßme celou najednou jako atribut.
Pro p°elo╛enφ tohoto programu musφme vlo╛it hlaviΦkov² soubor conio.h.
Podobn²m zp∙sobem m∙╛eme p°istupovat k r∙zn²m informacφm, kterΘ jsou
ulo╛eny na n∞kolika bitech ve slovu.
-
V²Φtov² datov² typ se pou╛φvß pro p°i°azenφ mnemonick²ch identifikßtor∙
mno╛in∞ celoΦφseln²ch hodnot. Nap°. deklarace
enum dny { ne, po,
ut, st, ct, pa, so } den;
definuje v²Φtov² typ dny, prom∞nnou den tohoto typu a
mno╛inu v²Φtov²ch konstant ne, po, ...
V C++ je mo╛nΘ prom∞nnΘ v²ΦtovΘho typu p°i°adit pouze hodnotu tohoto
typu nebo n∞kterou v²Φtovou konstantu tohoto typu. Nap°.
den = po;
-
Nßsledujφcφ strukturu m∙╛eme pou╛φt pro ulo╛enφ informacφ o n∞jakΘ osob∞:
enum pohlavi {muz,
zena};
struct osoba {
char jmeno[25];
pohlavi pohl;
union {
float plat;
double vaha;
};
};
Struktura umo╛≥uje sledovat jmΘno, pohlavφ a u mu╛∙ plat, zatφmco u
╛en vßhu (nebo obrßcen∞). V p°edchozφ kapitole jsme vytvß°eli konzolovou
aplikaci udr╛ujφcφ informace o na╣ich znßm²ch. Do definice struktury v
tΘto aplikaci p°idejte svaz (ve smyslu p°edchozφ ukßzky) a prove∩te dal╣φ
pot°ebnΘ zm∞ny. Hodnoty v²ΦtovΘho typu nenφ mo╛no Φφst p°φmo datov²m proudem
cin.
-
Roz╣i°te p°edchozφ zadßnφ tak, aby kartotΘka va╣ich znßm²ch byla ulo╛ena
v binßrnφm souboru. Po spu╣t∞nφ programu zjist∞te, zda soubor s kartotΘkou
existuje. Pokud neexistuje, zadßvejte data z klßvesnice, pokud existuje
naΦt∞te je ze souboru. Hodnoty z kartotΘky vypi╣te na obrazovku. Zajist∞te
takΘ mo╛nost zadßvßnφ ·daj∙ o dal╣φ osob∞. P°i ukonΦenφ programu v╛dy data
zapi╣te do souboru.
-
Mo╛nosti pou╛φvßnφ v²Φtov²ch typ∙ si ukß╛eme na nßsledujφcφ aplikaci GUI.
ZaΦneme s v²vojem novΘ aplikace. Nejprve na formulß° (na levou stranu)
vlo╛φme GroupBox (jeho Caption
zm∞nφme na ?Zajφmß m∞?), na GroupBox
vlo╛φme pod sebe 4x komponentu RadioButton
(p°i jejich vklßdßnφ musφ b²t vybrßna komponenta GroupBox;
jinak jsou RadioButtony vlo╛eny p°φmo na formulß°)
a zm∞nφme jejich vlastnosti Caption na Historie,
Literatura,
Biologie
a Psychologie. Dßle na formulß° vlo╛φme tlaΦφtko s textem Co
m∞ zajφmß a komponentu Label (zde zobrazen²
text vyprßzdnφme). Nastavenφ voliΦ∙ je vhodnΘ urΦovat pomocφ v²ΦtovΘho
typu. Nadefinujeme tedy v²Φtov² typ TZajem a prom∞nnou
Zajem
tohoto typu. Dßle vytvo°φme obsluhy kliknutφ na jednotliv²ch voliΦφch a
obsluhu stisknutφ tlaΦφtka. Pokud jsme nem∞nili nßzvy komponent potom dostaneme
(pozor nßsleduje v²pis celΘho programu):
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource
"*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
enum TZajem {Nic,
Historie, Literatura, Biologie, Psychologie};
TZajem Zajem = Nic;
__fastcall TForm1::TForm1(TComponent*
Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton1Click(TObject
*Sender)
{
Zajem = Historie;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton2Click(TObject
*Sender)
{
Zajem = Literatura;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton3Click(TObject
*Sender)
{
Zajem = Biologie;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton4Click(TObject
*Sender)
{
Zajem = Psychologie;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject
*Sender)
{
switch (Zajem)
{
case Historie: Label1->Caption = "Zajφmßm se o historii"; break;
case Literatura: Label1->Caption = "Zajφmßm se o literaturu"; break;
case Biologie: Label1->Caption = "Zajφmßm se o biologii"; break;
case Psychologie: Label1->Caption ="Zajφmßm se o psychologii";
break;
default: Label1->Caption = "Nezajφmßm se o nic";
}
}
Vyzkou╣ejte tuto aplikaci a zjist∞te jak pracuje.
-
V kapitole "P°φkazy °φdφcφ b∞h programu I" jsme vytvß°eli jednoduch² textov²
editor. Dopl≥te tuto aplikaci tak, ╛e na formulß° vlo╛φme t°i voliΦe :
Vlevo,
Doprost°ed
a Vpravo, kter²mi budete ovliv≥ovat zarovnßvßnφ zobrazenΘho textu
(vlastnost Alignment). Na formulß° p°idejte
dal╣φ tlaΦφtko, kter²m (prost°ednictvφm komponenty
ColorDialog)
budete m∞nit barvu textu v komponent∞
Memo
(vlastnost Font.Color).
Kontrolnφ otßzky:
-
M∙╛e b²t vφce prom∞nn²ch stejnΘho jmΘna?
-
M∙╛eme pou╛φvat samotnou strukturu bez vytvo°enφ jejφ instance?
-
Co je to globßlnφ prom∞nnß?
-
M∙╛e struktura obsahovat r∙znΘ typy dat (char, int, float, atd.)?
-
Jak p°istupujeme ke slo╛kßm struktury?
-
Je dovoleno mφt pole struktur?
╪e╣enφ