V tΘto Φßsti budou zve°ejn∞ny vaÜe dotazy i s naÜφ odpov∞dφ. Tak si budou moci odpov∞∩ p°eΦφst vÜichni zßjemci a ne pouze tazatel. Dotazy ke Kurzu C/C++ posφlejte na email mΘho kolegy: mrandrew@atlas.cz a dotazy ke kurzu o DirectX posφlejte na m∙j email: jiri.formanek@centrum.cz.
Pro v∞tÜφ p°ehlednost jsem rozd∞lil tuto sekci do vφce Φßstφ:
ObecnΘ otßzky
Dotazy k C++
Dotazy k DirectX
KrßtkΘ p°φklady
Je lepÜφ Microsoft Visual C++ nebo Borland C++?
Osobn∞ bych Vßm doporuΦoval Visual C++, ale je to takΘ v∞c vkusu. Pokud
nemßte nic proti Microsoftu tak jd∞te do Visual C++, v opaΦnΘm p°φpad∞ do
Borlandu, kter² sice nenφ Üpatn², ale podle mΘho nßzoru se VC++ nevyrovnß.
Microsoft mß urΦit∞ lepÜφ podporu nebo spφÜ reklamu:)
Lze zm∞nit nastavenφ ji₧ rozpracovanΘho
projektu na statickΘ linkovanφ MFC, ani₧ bych musel projekt znovu zavßd∞t?
Samoz°ejm∞. V menu Project zvolte polo₧ku Settings. Tam hned na
prvnφ kart∞ najdete zp∙sob linkovanφ. Dßvejte si ale pozor na to, ₧e konfigurace
projektu je rozd∞lena pro Release a Debug re₧im. Musφte ji
nastavit nejlΘpe pro oba re₧imy, ale hlavn∞ pro Release, proto₧e tuto verzi pak
distribuujete.
Mßm n∞jakou t°φdu (nap°φklad CMujEdit zd∞d∞n² od CEdit) a
mßm ji zobrazenu v panelu ClassView. ObΦas se stane nßsledujφcφ v∞c,
kterΘ nerozumφm: p°idßm t°φd∞ pomocφ polo₧ky kontextoveho menu "Add
Windows Message Handler" n∞jakou oblu₧nou funkci, pak se mi nelφbφ
co d∞lß a jß ji chci odstranit. Pokud ji sma₧u ruΦn∞ p°φmo
v k≤du, stejn∞ jako odkaz na nφ v map∞ zprßv a v hlaviΦkovΘm
souboru, je vÜe v po°ßdku. Pokud vÜak kliknu v ClassView u p°φsluÜnΘ
metody na Delete a potvrdφm, ₧e se majφ odkazy smazat a t∞lo metody
zakomentovat, pak se n∞kdy stane, ₧e mi celß t°φda zmizφ z ClassView
a zp∞t se mi objevφ teprve potΘ, co pomoci ClassWizardu znovu
p°idßm smazanou metodu. Kdy₧ ji nßsledn∞ vyma₧u "ruΦn∞", je vÜe
v po°ßdku. ╚φm to je zp∙sobeno?
ClassView nenφ dokonalΘ. Pokud
vyma₧ete kousek klφΦovΘho slova "class", tak t°φda z ClassView zmizφ
a to je v po°ßdku, proto₧e v²vojovΘ prost°edφ tuto t°φdu nenajde,
ale obΦas se stane, ₧e t°φda zmizφ p°i normalnφ operaci s t°φdou
jako je nap°φklad p°idßvßnφ a mazßnφ funkcφ. Toto je chyba samotnΘho v²vojovΘho prost°edφ a ani nejnov∞jÜφ
SP (Service Pack) tuto chybu neopravuje. Pokud se vßm stane, ₧e t°φda
zmizφ, pokuste se vratit krok, po kterΘm t°φda zmizela a poslΘze ho
prove∩te znovu. Pokud nejde krok vrßtit, musφte bu∩to Φekat a₧ se jednoho
krßsneho dne t°φda znovu objevφ nebo by m∞lo staΦit vyjmout a zase p°idat
hlaviΦkov² i implementaΦnφ soubor, ve kterΘm je t°φda. Zkuste restartovat
VC++ i cely poΦφtaΦ a poslednφ mo₧nost je, ₧e vyma₧ete soubory s
p°φponami .ncb a .opt v adresß°i vaÜeho projektu. To jsou soubory,
ve kter²ch je ulo₧ena prßv∞ struktura ClassView a vy tak p°inutφte
VC++, aby ji znovu vytvo°ilo.
Existuje n∞jakΘ freeware v²vojovΘ prost°edφ pro jazyk C/C++ a
kde jej mohu zφskat?
Ano, existuje Dev-C++ a stßhnout si ho m∙₧ete na tΘto adrese: www.bloodshed.nu.
NovΘ Dev-C++ by m∞lo b²t k dispozici na ChipCD.
Jak² je rozdφl mezi cout a printf()?
Ve VC++ je mo₧nΘ pou₧φvat
obojφ, cout i
printf(). Osobn∞ mßm radÜi
printf(), proto₧e
umo₧≥uje lepÜφ formßtovßnφ û kratÜφ a p°ehledn∞jÜφ, ale jinak je to zcela na
Vßs.
Mohl byste mi vysv∞tlit rozdφl mezi
ukazatelem a normßlnφ prom∞nnou? ProΦ n∞kterΘ funkce cht∞jφ jako parametry
ukazatele a jinΘ normßlnφ prom∞nnou?
VÜimn∞te si, ₧e nap°. funkce
SelectObject() bere
jako parametr ukazatel na objekt. Kdy₧ se funkci p°edßvß parametr hodnotou (to
znamenß jako normßlnφ prom∞nnou bez hv∞zdiΦky), ud∞lß se kopie p°edßvanΘho
objektu na stacku. Kdy₧ se jednß o objekt, musφ se
ud∞lat kompletnφ kopie, vÜechny prom∞nnΘ! P°edstavte si, ₧e objekt bude mφt 20
prom∞nn²ch a navφc m∙₧e obsahovat dalÜφ objekty û to jist∞ uznßte, ₧e je znaΦn∞
neefektivnφ, kdy₧ pak tuto kopii stejn∞ zahodφte. Mnohem lepÜφ je, kdy₧ p°edßte
pouze ukazatel. Tak₧e obecn∞ platφ, ₧e kdy₧ p°edßvßte objekty je lepÜφ pou₧φvat
ukazatele, i kdy₧ nechcete objekt uvnit° funkce m∞nit. Naopak u b∞₧n²ch typ∙ se
p°edßvß hodnota, samoz°ejm∞ pokud chcete hodnotu prom∞nnΘ ve funkci m∞nit,
musφte p°edat bu∩ ukazatel nebo referenci.
Je lepÜφ Java nebo C++, a v Φem?
Nedß se °φci, jestli je lepÜφ Java nebo C++. Za prvΘ, ka₧d² jazyk mß svΘ p°ednosti a svΘ
nev²hody. Za druhΘ se jednß o dva r∙znΘ typy programovacφch jazyk∙. I kdy₧ je
syntaxe velice podobnß, C++ je jazyk kompilovan² tzn. ₧e program se jednou p°elo₧φ
a pak u₧ se jen spouÜtφ. Ale Java je jazyk interpretovan² tzn. ₧e se k≤d
p°eklßdß p°i ka₧dΘm spuÜt∞nφ. Proto takΘ C++ nemß sv∙j skriptovacφ jazyk (znßme
JavaScript, VBScript, ale C++Script nikoliv:). Tak₧e by
se dalo °φci, ₧e program v C++ bude v₧dy rychlejÜφ ne₧ stejn² program v Jav∞, ale
takΘ to zßle₧φ na mnoha dalÜφch okolnostech.
Pou₧φvß se v C++ v deklaraci prom∞nnΘ slovo var, co to var
znamenß?
Nepou₧φvß. KlφΦovΘ slovo var se pou₧φvß v Pascalu k
deklaraci prom∞nn²ch a k p°edßvßnφ parametr∙ funkcφm odkazem. Jinak
var je z°ejm∞ od slova variable, co₧ je prom∞nnß.
Na zßklad∞ vaÜeho kurzu jsem se zaΦal uΦit
programovacφ jazyk C, za pou₧itφ knihy "UΦebnice jazyka C 1.". Mßm vÜak problΘm:
v₧dy kdy₧ zkompiluji sv∙j program, ten se zpustφ,ale po provedenφ vÜech p°φkaz∙
se ihned ukonΦφ a jß nejsem schopen zkontrolovat sprßvnost v²poΦt∙ na obrazovce.
Po zkuÜenostech s Pascalem jsem hledal v knize n∞jak² p°φkaz podobn² READKEY,
ale nic takovΘho jsem nenaÜel. Mß jazyk C n∞jak² podobn² p°φkaz? Nebo je chyba v
mΘm kompileru?
Chyba to nenφ. Program
prost∞ skonΦφ a v²stupnφ okno se zav°e. Pokud je v²poΦet programu rychl², Φlov∞k
post°ehne jen probliknutφ. ┌pln² ekvivalent funkci READKEY
z Pascalu v C nenajdete, ale m∙₧ete pou₧φt funkci getchar(),
kterß funguje podobn∞ (navφc vracφ ordinßlnφ Φφslo stisknutΘho znaku).
Abyste mohli tuto funkci pou₧φt, musφte vlo₧it hlaviΦkov² soubor
stdio.h.
Bude plynul² p°echod z C++ na C#?
Snad ano. C# mß b²t n∞co mezi Visual Basicem a Visual C++, tak₧e prost°edφ
bude z°ejm∞ "p°ßtelÜt∞jÜφ", ale stßle se bude pou₧φvat jazyk C++. Nynφ s
odstupem Φasu m∙₧u tento dotaz doplnit. O C# se °φkß,
₧e je spojenφm toho nejlepÜφho z jazyk∙ C++, Visual Basic a Java. SkuteΦn∞, kdy₧
se podφvßte na syntaxi, tak je velice podobnß Jav∞ a p°esto nejde o
interpretovan² jazyk. C# je zcela objektov∞
orientovan² jazyk urΦen² pro novou platformu .NET. Pro toho, kdo se uΦφ C++ bude
p°echod na C# velice rychl².
Co je to sprite?
Odpov∞∩ byste jist∞ naÜli v n∞kterΘm kurzu DirectX. Sprite je z
anglickΘho p°ekladu n∞co jako duch:-) Sprite je vlastn∞ vykreslovan²
obrßzek. Sprite je v∞tÜinou vytvo°en z bitmapy, kterou naΦtete z externφho
souboru. Pokud budete mφt pohybujφcφ se letadlo, prßv∞ letadlo bude sprite. Za
sprite m∙₧eme pova₧ovat nap°φklad tlaΦφtko menu nebo kurzor myÜi.
Jak zakomponovat zvuk do
stßvajφcφch projektu DirectX?
Asi nejlepÜφm °eÜenφm je pou₧φt dalÜφ komponentu DirectX a tou je
DirectMusic. Tato komponenta umo₧≥uje, jak p°ehrßvßnφ hudby, tak i samostatn²ch
zvuk∙. DirectMusic ΦßsteΦn∞ nahrazuje komponentu DirectSound, kter² je rovn∞₧ k
dispozici, ale °ekl bych, ₧e s DirectMusic se lΘpe pracuje. Mßm v plßnu ud∞lat
mal² kurz DirectMusic, kde vysv∞tlφm zßklady, abyste mohli svou aplikaci
ozvuΦit. Nebude to ovÜem nic podrobnΘho.V p°φÜtφm dφle DirectX se budu tomuto
tΘmatu v∞novat.
Poznßmka k jin²m verzφm
Visual C++ a DirectX SDK.
Praktick²m zkouÜenφm jsem zjistil, ₧e s nov²m DX SDK 8.0 pracuje pouze
Visual C++ 6.0 a vyÜÜφ. Na ni₧Üφch verzφch nelze projekty z kurz∙ zkompilovat
kv∙li z°ejmΘ nekompatibilit∞. Proto pokud vlastnφte verzi 4.0 nebo 5.0 nem∙₧ete
pou₧φvat DirectX 8.0. DirectX SDK 8.0 vyÜlo na ChipCD vydßnφ 11/01.
Existuje Φesky psanß kniha o DirectX?
Bohu₧el jsem o takovΘ publikaci neslyÜel. V angliΦtin∞ je
takov²ch knih n∞kolik (viz. www.microsoft.com).
Bude nejaky serißl o DirectShow?
Nebude. Po DirectDraw bych cht∞l pokraΦovat komponentou DirectInput a pak jeÜt∞ nevφm, ale DirectShow to nebude.
Vφme. StaΦφ pou₧φt pointer na pointer na integer. Nejprve vytvo°φte pole ukazatel∙ na integer, potom p°es ukazatele v tomto poli vytvo°ite pole integeru. Srozumiteln∞jÜφ bude spφÜ ukßzka:
#include "stdafx.h"
#include <stdio.h>
int **pp_pole;
typedef int *PINT;
int main(int
argc, char* argv[])
{
pp_pole = NULL;
pp_pole = new PINT[10];
pp_pole[0]
= new int[1];
pp_pole[1] = new int[2];
pp_pole[2] = new int[4];
pp_pole[0][0] = 5;
pp_pole[1][0] = 6;
pp_pole[1][1] = 7;
pp_pole[2][0] = 8;
// atd.
printf("V poli jsou:\n%u\n%u %u\n", pp_pole[0][0], pp_pole[1][0],
pp_pole[1][1]);
return
0;
}
1. Program pro p°evod Φφsla z desφtkovΘ soustavy do binßrnφ
1. Trocha teorie
Vezmeme desφtkovΘ Φφslo a stßle ho celoΦφseln∞ d∞lφme dv∞ma, zbytek po tomto d∞lenφ sepφÜete a pak odspoda p°eΦtete Φφslo vyjßd°enΘ ve dvojkovΘ soustav∞. Tedy nap°φklad pro 157:
Operace | V²sledek | Zbytek |
157 : 2 | 78 | 1 |
78 : 2 | 39 | 0 |
39 : 2 | 19 | 1 |
19 : 2 | 9 | 1 |
9 : 2 | 4 | 1 |
4 : 2 | 2 | 0 |
2 : 2 | 1 | 0 |
1 : 2 | 0 | 1 |
A p°eΦteme zespoda. Tedy: (157)dec = (10011101)bin.
2. Praxe
Prom∞nnΘ:
length je dΘlka binßrnφho Φφsla, m∙₧ete ale zvolit
pevn∞.
retezec je ji₧ alokovanΘ pole znaku o dostateΦnΘ
velikosti (max. poΦet znaku bin. Φφsla + 1 znak na ukonΦovacφ \0) d∞lφme bitov²m
posunem, kdy prost∞ zahodφme nejmΘn∞ v²znamn² bit a tφm se Φφslo vyd∞lφ dv∞ma.
V²sledn² °et∞zec je vytvß°en od konce.
Vlastnφ program:
if(0 == cislo)
// osetrime 0
{
retezec[length - 2] = '0';
}
else
{
short index = length-1;
while(cislo > 1)
{
retezec[--index] = (char)('0' + (cislo
% 2));// zbytek dame do spravne
pozice
cislo >>= 1;
// vydelime dvema (bitovy posun)
}
retezec[--index] = '1';
}