¢ Kurs programov*n) "C" '*st 6.¢ ------------------------------------¢¢ ù=37,»=92,²=123,å=91,ñ=93,ó=39,א=38¢Θ definice znaku procenta, obr*cen[ho lom)tka, lev[ slo(en[ z*vorky, lev[ a prav[ lomen[ z*vorky, apostrofu.¢Θ a nov% znaku and¢¢ P@ed textem vlastn)ho kursu uvedu n%kolik pozn*mek. P@edev&)m jeho obsah bude odli&n` od pvodn)ho z*m%ru. Cht%l jsem p@ipravit @e&en) velmi zaj)mav[ho slovn%-matematick[ho hlavolamu, ale narazil jsem na jeho p@)li& velkou slo(itost. Nezvl*dnul jsem program vymyslet a nav)c se probl[m dot`k* hranice @e&itelnosti ]loh na po')ta'i. I kdy( jde o v principu jednoduch` algoritmus, nar+st* p@)&ern% doba pot@ebn* pro v`po'et. Zat)m jsem s jeho odla⇦ov*n)m p@e&el na STE na 16 MHz.¢ Druh`m m`m probl[mem je nedostate'n[ zvl*dnut) problematiky sm%rn)k+ a pointer+. ╱M*m v tom chaos.$ Proto je nebudu v t[to lekci rozeb)rat nijak do hloubky.¢ Z ve@ejn[ho archivu pro ATARI jsem z)skal ned*vno dv% verze vylep&en[ho kompil*toru pro DEEP BLUE C. Um) lomen[ z*vorky a z@ejm% i datov[ struktury. Rozum) si s n)m norm*ln) linker, i kdy( je v p+vodn)m manu*lu naps*no, (e odm)tne soubor nachystan` kompil*torem s jin`m ')slem verze.¢ ③koda, (e pam%④ vyhrazen* pro psan` program je dosti mal*. Zkusil jsem zkompilovat kr*tkou textovou hru od Jirky p@ipravenou p+vodn% pro FLOP, kdy( je&t% nev%d%l, (e datov[ struktury nem+(e pou()vat. Nov` kompil*tor text bez probl[m+ bral, dokud nenahl*sil malou pam%④.¢ P@es toto omezen) jsem se rozhodl kompil*tor za@adit jako doln%k kursu C a nad*le pou()vat zdrojov[ v`pisy chystan[ pro n%j. P@ibl)()me se tak v)ce stylu psan) program+ pro C['ka na v%t&)ch po')ta')ch a o to tady jde. M*m k n%mu i del&) popis v angli'tin%, kter` se mi zd* do magaz)nu zbyte'n[ cp*t. Samoz@ejm% jej po&lu ka(d[mu p@)padn[mu z*jemci.¢¢¢ Podm)n%n` v`raz - tern*rn) oper*tor.¢¢ Tato zvl*&tn) v%c p@ipom)n* pom)n%n` p@)kaz IF. Jeho z*pis je krat&), ale pou()t se d* jen pro p@i@azen). Jeho z*kladn) syntaxe je:¢ v`raz_podm ? v`raz_1:v`raz_2¢V`sledn* hodota v`razu z*vis` na pravdivosti jeho '*sti uveden[ p@ed oper*torem otazn)k. Podle u'ebnice je u()v*n) podm)n%n[ho v`razu m*lo 'ast[.¢¢P@)klad p@evodu znak+ na mal* p)smena s pou(it)m obou zp+sob+¢podm)nka if ╱c>="A" אא c<="Z"$¢ c=c⇩╱"a"-"A"$;¢¢podm)n%n` v`raz¢ c= ╱c>="A" אא c<= "Z"$? c⇩╱"a"-"A"$ : c;¢¢Zde se ov&em z podm)n%n[ho v`razu st*v* p@)kaz, proto(e je ukon'en st@edn)kem. ¢╱ inverzn) B zde definuje znak "and" pro tisk*rnu $¢¢P@.2: Chcete p@i@adit prom%nn[ x absolutn) hodnotu prom%nn[ y:¢¢d@)ve¢ if ╱y>=0$ x=y; else x=-y;¢¢nov%¢ x = ╱y>=0$? y : -y;¢¢ Pozorn` 'ten*@ si v&imne, (e prvn) p@)klad nep@in*&) (*dnou ]sporu, proto(e v n%m doch*z) n%kdy ke zbyte'n[mu p@i@azov*n). Druh` p@)klad od kolegy Radka m* sv+j smysl.¢¢¢ Pointery a adresov[ oper*tory I¢¢ Pou()v*n) ukazatel+ na adresu a adresov`ch oper*tor+ je to n%jd%siv%j&), co jsem zat)m na C['ku objevil. Jen(e bez nich by nebylo C['ko C['kem. P@itom jsem nena&el ani jednozna'n[ n*zvy obou oper*tor+, vyjma ciz)ch, to se pak &patn% o nich p)&e.¢ Z*kladn) u(it) je pro pr*ci s prom%nn`mi a v+bec hodnotami. Za jist`ch okolnost) tak[ asi m+(e pointer nahradit zn*m[ basicovsk[ p@)kazy PEEK a POKE. To zat)m nech*me stranou. Vzpomete si, (e prom%nn[ jsou lok*ln)ho charakteru ╱v%t&inou$, co( znamen*, (e plat) pro funkci, v jej)m( t%le byly deklarov*ny. To je sice hezk[, ale tak[ to na prvn) pohled jednotliv[ funkce jaksi izoluje. Sice jsme ji( pou()vali n%kolik funkc), kter[ vracely ur'itou hodnotu, nap@)klad getchar╱$, ale 'asto je pot@eba funkc)m @adu prom%nn`ch p@ed*vat pro jejich dal&) zpracov*n).¢ Situaci @e&) ukazatel[ na adresy hodnot. M%jme za p@)klad standartn) funkci scanf╱$ pro form*tovan` vstup. ╱V na&ich knihovn*ch chyb), proto dosud nebyla v kursu pou(ita.$ Jej) tvar je podobn` funkci printf╱$. Obsahuje tak[ form*tovac) @et%zec s p@edepsan`m tvarem vstupu prom%nn`ch a jejich seznam. Situace je ale z*sadn% odli&n*. Zat)mco funkci printf╱$ jsou p@i jej)m vyvol*n) p@ed*ny hodnoty prom%nn`ch pro vyti&t%n), funkce scanf╱$ pot@ebuje m%nit obsah p+vodn)ch prom%nn`ch.¢ Proto se funkci p@edaj) pomoc) referen'n)ho oper*toru א adresy vlastn)ch prom%nn`ch.¢p@)klad:¢ int a,b;¢ char stringå100ñ;¢ scanf╱"ùuùdùs",אa,אb,string$;¢ printf╱"unsigned - bez znam[nka:ùu int: ùd »nùs",a,b,string$;¢¢ Form*tovac) prvek ùu o'ek*v* ')selnou hodnotu bez znam[nka, tedy pouze kladn* ')sla, ùd ')slo znam[nkov[, ale pouze cel[, ùs zna') zpracov*n) @et%zce.¢ V`raz אa p@ed*v* funkci skute'nou adresu prom%nn[ v pam%ti, na kterou zap)&e vstupuj)c) hodnotu. Pou(it) skr`v* stejn[ nebezpe') jako POKE u BASICu. Sta') n%co spl[st a u( se vesele p@episuj) syst[mov[ registry a jin* zaj)mav* m)sta v pam%ti.¢ Aby u(it) sm%rn)k+ nebylo p@)li& jednotv*rn[, chyb) u jm[na @et%zcov[ prom%nn[. Je toti( samo o sob% ukazatelem na adresu v pam%ti, na m)sto ulo(en) za'*tku @et%zce.¢¢ Druh`m oper*torem, podle u'ebnice vlastn% prvn)m, je deferen'n) oper*tor ✓, kter` bude d*le naz`v*n pointer. Je to prom%nn*, kter* obsahuje adresu, na n)( je hodnota zpracov*van[ prom%nn[. P@ipom)n* mi to zp+soby adresov*n) pou()v*n[ ve strojov[m jazyce mikroprocesor+. Samotn` pointer m* tak[ n%jak[ um)st%n) v pam%ti, jeho adresa se b%(n% nevyu()v*. D+le(it%j&) je v%d%t, (e pointer se deklaruje na stejn` datov` typ, jako prom%nn*,na ni( m* ukazovat.¢¢ int i,✓p_i;¢ p_i = אi;¢¢ Prvn) @*dek deklaruje prom%nnou s n*zvem i a pointer na typ integer s n*zvem p_i. Ve druh[m @*dku se pointer inicializuje adresou prom%nn[ i, 'ili od tohoto okam(iku na ni ukazuje. Pro jej) vlastn) zm%nu je mo(n[ pou()t d*le dva zp+soby:¢¢ i = 5;¢ ✓p_i = 5;¢¢Oba p@)kazy ud%laj) tot[(. V`znam pou(it) pointeru je p@i zpracov*n) hodnot prom%nn`ch ve volan`ch funkc)ch. T%m se p@ed*vaj) adresy a v jejich definic)ch ╱prost% t%le funkce$ jsou pou(ity pointery. Ty mus) b`t i ve funkci scanf╱$, ov&em jej) zdrojov` v`pis nem*m k dispozici.¢ V&im%te si, (e pomoc) pointeru se d* vlastn% nahradit p@)kaz POKE, proto(e jej m+(eme inicializovat libovolnou hodnotou. Tedy m)sto p_i = אx se uvede p@)m* hodnota t@eba p_i = 20000. Pou(it) pointer+ v tomto smyslu p@)ru'ka nijak nerozv*d) a tak mi zat)m nen) jasn[, na jakou fyzickou adresu vlastn% ukazuje, proto(e prom%nn[ b%(n% zab)raj) v)ce ne( jeden bajt.¢ Jm[no pointeru nemus) samoz@ejm% za')nat znaky p_, ale je to tak v`hodn[ pro jejich snadnou identifikaci v textu programu.¢¢¢ Jako p@)loha ke kursu jsou uvedeny dva v`pisy program+ opakuj)c)ch star&) l*tku. Prvn) obsahuje dv% @e&en) v`po'tu nejmen&)ho spole'n[ho d%litele uveden[ v minule recenzovan[ knize "Za')n*me s programov*n)m". V n) jsou napsan[ v PASCALU, ale pro jejich jednoduchost nen) (*dn` probl[m je p@epsat do jin[ho programovac)ho jazyka.¢ Hlavn) funkce main╱$ nem* s vlastn)m v`po'tem nic spole'n[ho, slou() jen pro mo(nost volby op%tn[ho v`po'tu nebo pro ukon'en) programu. Je prakticky p@evzan* z minul[ho v`pisu.¢ Ve vlastn) funkci delitel╱$ jsou p@edvedeny dva zp+soby vstupu odpov%di na ot*zku. P@i pou(it) getchar╱$ se mus) uv[st funkce je&t% jednou pro zlikvidov*n) kdu kl*vesy Return.¢ Funkce gets╱$ vy(aduje pou(it) dal&) pom%rn% dlouh[ pomocn[ prom%nn[. O&et@) si ale sama Return a tak[ chybn% napsan` v)ceznakov` vstup, nap@)klad cel[ sl+vko "ano"¢¢ Druh` p@)klad je p@evzan` z p@)ru'ky "Od Basicu k C['ku", se kterou jsem za')nal sv[ prvn) kr+'ky. Posuzuje pravdivost odpov%d) na ot*zky ohledn% stavu po'as) podle logick`ch podm)nek vzniku duhy.¢ Zad*v*n) ')sel je d%l*no jako minule pomoc) vstupu @et%zce a jeho n*sledn[ho p@evodu na ')slo. Na&t%st) jsem ji( pochopil, pro' p@i zad*n) v%t&) hodnoty vrac) funkce jak[sy z*porn[ a v+bec podivn[ hodnoty. Nic podivn[ho na tom nen), proto(e to souvis) s velikost) data typu INTEGER. Jeho b%(n* d[lka je ulo(ena ve dvou bajtech, m+(e nab`t tedy nejvy&&) hodnoty teoreticky 65535. Jen(e zase je norm*ln% ch*p*no jako ')slo se znam[nkem, proto je jeho rozsah omezen od -32768 do ⇩32767. Taky m% to mohlo doj)t u( d@)v, proto(e mezn) hodnoty prom%nn`ch jsou u popisu datov`ch typ+ v p@)ru'k*ch uv*d%ny a j* to taky 'etl.¢ P@i psan) obou program+ moje hlavn) chyba byla v zapomenut) ]pravy p@eb)ran`ch ]sek+ zdrojov`ch text+ z jin`ch program+. Opom%l jsem v nich po p@enosu p@ejmenovat pou(it[ prom%nn[.¢