-
Preprocesor umo╛≥uje provßd∞t takΘ podmφn∞n² p°eklad Φßstφ zdrojovΘho k≤du
programu. Podmφn∞nΘ direktivy (#if, #ifdef,
#ifndef,
#else,
#elif
a
#endif)
urΦujφ, kterß Φßst textu zdrojovΘho programu bude p°eklßdßna. Nejd∙le╛it∞j╣φ
pou╛itφ t∞chto direktiv je zaji╣t∞nφ p°ekladu sprßvn²ch Φßstφ programu
v p°φpad∞, kdy program je urΦen pro n∞kolik r∙zn²ch prost°edφ (nap°. pro
DOS nebo Windows) nebo v p°φpad∞, kdy zdrojov² text bude pou╛φvßn v programu
zapsanΘm v jazyku C nebo C++ (nap°. jeden hlaviΦkov² soubor budeme n∞kdy
pou╛φvat v C a jindy v C++). M∙╛eme je takΘ pou╛φt k zaji╣t∞nφ toho, aby
jeden hlaviΦkov² soubor nebyl do jednoho programu vlo╛en vφcekrßt.
Na tuto poslednφ mo╛nost se podφvßme podrobn∞ji. Kdy╛ se podφvßme na
prßzdn² hlaviΦkov² soubor n∞jakΘho formulß°e (zaΦneme s v²vojem novΘ aplikace
GUI, p°ejdeme do editoru k≤du a v mφstnφ nabφdce editoru zvolφme Open
Source/Header File) pak vidφme tento text:
//---------------------------------------------------------------------------
#ifndef Unit1H
// zji╣t∞nφ, zda je definovßn symbol Unit1H
#define Unit1H
// definice symbolu Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public
TForm
{
__published: // IDE-managed
Components
private: // User
declarations
public: //
User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1
*Form1;
//---------------------------------------------------------------------------
#endif
// konec podmφn∞nΘho p°ekladu
V tomto textu je zaji╣t∞no, aby nemohl b²t podruhΘ vlo╛en hlaviΦkov²
soubor do stejnΘho programu (pomocφ deklarace symbolu - makra odpovφdajφcφho
jmΘnu souboru). Pokuste se pochopit jak pou╛itΘ direktivy pracujφ.
-
Direktiva #pragma umo╛≥uje zavßd∞t direktivy
specifickΘ pro danou implementaci (r∙znΘ p°ekladaΦe mohou mφt r∙znΘ direktivy).
Direktiva, kterß nenφ v danΘm p°ekladaΦi podporovßna je p°ekladaΦem ignorovßna.
Pokud si prohlΘdneme n∞kter² z ji╛ vytvo°en²ch program∙, pak nalezneme
direktivu
#pragma hdrstop
Tato direktiva ukonΦuje seznam hlaviΦkov²ch soubor∙, kterΘ budou p°edp°elo╛eny.
P°ed touto direktivou jsou vklßdßny hlaviΦkovΘ soubory, kterΘ se nem∞nφ
a je tedy mo╛no je p°elo╛it pouze jednou. Tφm je mo╛no zkrßtit dobu dal╣φch
p°eklad∙ aplikace.
C++ Builder definuje je╣t∞ n∞kolik takov²chto direktiv.
-
HlaviΦkov² soubor math.h obsahuje definice r∙zn²ch matematick²ch
funkcφ. Jsou zde nap°. definovßny funkce: acos
(arkus kosinus), asin (arkus sinus), atan
(arkus tangens), ceil (zaokrouhlovßnφ nahoru),
cos
(kosinus), cosh (hyperbolick² kosinus), exp
(exponencißlnφ funkce), floor (zaokrouhlovßnφ
dolu), log (p°irozen² logaritmus), log10
(dekadick² logaritmus),
poly (hodnota polynomu),
pow
(xy), sin (sinus), sinh
(hyperbolick² sinus), sqrt (druhß odmocnina),
tan
(tangens) a tanh (hyperbolick² tangens).Pomocφ
nßpov∞dy se seznamte nap°. s funkcφ pow. Vyzkou╣ejte
si vzorov² p°φklad z nßpov∞dy.
-
Nßsledujφcφ konzolovß aplikace ukazuje pou╛itφ parametr∙ funkce main
k p°edßvßnφ parametr∙ p°φkazovΘho °ßdku. Vyzkou╣ejte ji s r∙zn²mi parametry.
V integrovanΘm prost°edφ C++ Builderu m∙╛eme parametry p°φkazovΘho °ßdku
zadßvat v dialogovΘm okn∞ zobrazenΘm po volb∞ Run | Parameters.
Co urΦuje parametr s indexem 0? Jak je nutno zadßvat parametry obsahujφcφ
mezery?
int main(int argc,
char **argv)
{
int i;
cout <<
argc << endl;
for (i = 0;
i < argc; i++)
cout << "Parametr " << i << ": " << argv[i] <<
endl;
getch();
return 0;
}
-
Nßsledujφcφ konzolovß aplikace obsahuje funkci kopφrujφcφ znaky z klßvesnice
na obrazovku a poΦφtajφcφ jejich poΦet. UkonΦujφcφ znak je znak teΦky.
Je to prvnφ program, ve kterΘm jsme vytvo°ili svoji funkci (vφce o deklaracφch
a definicφch funkcφ se dozvφme v nßsledujφcφ kapitole).
int copy(void)
{
char c;
int pocet
= 0;
while ((c
= getchar()) != '.') {
cout << c;
pocet++;
}
cout <<
c; // vypφ╣e se teΦka
cout <<
endl;
return pocet;
}
int main(int argc,
char **argv)
{
cout <<
"Napi╣ v∞tu ukonΦenou teΦkou:" << endl;
cout <<
"PoΦet znak∙ = " << copy() << endl;
getch();
return 0;
}
Program vyzkou╣ejte. Upravte funkci copy tak, aby (mimo kopφrovßnφ
znak∙) poΦφtala pouze znaky mezer.
-
Pomocφ voleb Run | Trace Into a Run | Step Over m∙╛eme provßd∞t
nß╣ program po jednotliv²ch °ßdcφch. Vyzkou╣ejte. Pokuste se zjistit jak²
je rozdφl mezi t∞mito volbami. Pomocφ t∞chto voleb (trasovßnφ programu)
m∙╛eme zjistit, zda p°φkazy programu se provßd∞jφ v tom po°adφ, ve kterΘm
oΦekßvßme.
-
Trasovßnφ programu nßm m∙╛e pomoci p°i lad∞nφ program∙ (zji╣╗ovßnφ, zda
program pracuje sprßvn∞). Dal╣φ pomocφ by bylo, kdybychom si mohli zjistit
hodnoty n∞kter²ch prom∞nn²ch a mohli sledovat, zda tyto hodnoty se sprßvn∞
m∞nφ. Toto m∙╛eme snadno provΘst. Volbou Run | Add Watch p°idßme
do sledovacφho okna prom∞nnΘ, kterΘ nßs zajφmajφ a p°i trasovßnφ programu
se ve sledovacφm okn∞ tyto prom∞nnΘ zobrazujφ i s jejich aktußlnφmi hodnotami.
Vyzkou╣ejte pro p°edchozφ konzolovou aplikaci pro prom∞nnΘ c a pocet.