Programátorská Akty X
Existujú veci medzi nebom a zemou. Na prvý pohľad nevysvetliteľné udalosti,
ktoré bohužiaľ sprevádza aj nás - programátorov. Ide o prípady, kde sa
obrovskou zhodou náhod stalo niečo, čo sa vymyká ľudskému chápaniu.
Nižšie nájdete niekoľko takýchto prípadov, kedy som nevedel, či je to,
čo sa deje, možné, alebo sa mi to len zdá.
Pascal: "Nepoznám príkaz end"
Pascalovský debugger mi hlásil chybu na konci jednej procedúry, konkrétne na riadku, na ktorom nebolo napísané nič iné, než "end;". Najprv som hľadal chybu v riadku nad tým, ale nič. Nakoniec som zakomentoval celé telo procedúry a nechal len begin a end. Tá istá chyba: "Neznámy identifikátor". Vymazal som všetko na riadku a napísal ho znova - nič sa nezmenilo. Potom som otvoril pas súbor v textovom editore (nie Notepade, ale v pokročilejšom) v nádeji, že sa tam vyskytuje nejaký znak, ktorý Pascal nezobrazí a zároveň ho berie za chybu, ale žiadny tam nebol. Vymazal som pre istotu celý riadok a napísal ho znova. A čo sa nestalo: "Compile successful". Z autora kódu nakoniec vypadlo, že ho nepísal priamo v pascalovský editore, ale v niečom inom. Musel sa mu tam votrieť nejaký znak, ktorý sa nezobrazil ani v Pascale a ani v textovom editore. Ten som vymazal spolu s cały riadkom, predtým som totiž v Pascale vymazal len end a bodkočiarka, znak tam asi zostal. Zaujímavé, že?
Delphi: "Nie je možné vložiť tlačidlo na formulár, aneb niekde to asi tečie"
Toto je naozaj veľký kúsok, ale stojí za prečítanie, je to asi môj najväčší programátorský akt X. Svoj veľký projekt Organizer Študent DOG som písal spočiatku v Delphi 7 a až do tej doby s ním nebol žiadny problém. Jedného krásneho dňa mi ale pri pokuse o vloženie nového bitbuttonu na formulár Delphi zahlásil nejakú chybu, už si presne nepamätám znení, bola to nejaká výnimka plná nezmyselných adries. K môjmu zdesenie som nebol schopný na formulár nič pridať. "Že by tam toho bolo veľmi? Vždy? V Delphi sú napísané aj softvéru pre banky, tie predsa musí mať na formulári viac komponentov, ako ja !, hovorím si." Projekt som zavrel a otvoril znova, tak samá chyba. Po nejakej dobe som sa o to pokúsil znova a všetko bolo v poriadku. Asi nejaká náhoda, utešujem sa a programujem ďalej. Po pridaní druhého tlačidla ale opäť vyskočila tá istá hláška a tlačidlo sa nevložili. Keď som ich pár vymazal, išli zase vložiť, ale ďalšie som tam potom nenacpal. To isté sa začalo diať aj s ďalšími komponentmi. Program bol nepoužiteľný. Došiel som k záveru, že sa niečo muselo po **** v Delphi a ony nejako poškodili zdrojové kódy k formuláru.
Nainstaloval som si teda na notebook Delphi 2007 (rovnako som do nich chcel program raz previesť) a začal tvoriť všetky formuláre znova. Bola to neskutočná práce, priateľka sedela u veľkého PC a hlásila "bitbutton 131, left 10 top 150 caption uložiť, width 50 height 25 onclick procedure bitbutton131click". Ja na notebooku naklikával komponent po komponente, a že ich bolo. po niekoľkých dňoch som napojil nové formuláre na kód programu a všetko spustil: "V poriadku". Nové komponenty išli na formulár vkladať v poriadku. Zdrojáky formulára sa teda nejako poškodili. Ale to nebolo všetko
Po niekoľkých dňoch mi program začal hádzať chybovú hlášku "Access violation", vždy pri práci s kalendárom, ale nedokázal som prísť na to, ako ju spoľahlivo vyvolať. Tiež mi bolo divné, že sa mi nikdy predtým neobjavila, keď bol program ešte vybudovaný pod Delphi 7. V zúfalstve som sa obrátil na jediného človeka, ktorý by mohol vedieť, o čo ide, na môjho strýka Petra, ktorý sa programovaním zaoberá na vysokej úrovni. Keď som k nemu dorazil, žiadna chyba sa zamozřejmě neukázala. Klikali sme v kalendári na všetko možné a nič. Vyzeral som, že nemám všetkých päť pohromade, ale po hodine a pol pokusov nám chyba nakoniec vyskočila.
Podarilo sa nám ju vyvolať kliknutím na tlačidlá a dni v kalendári v určitom poradí!. Jednalo sa vždy o rovnakú adresu v pamäti, kde došlo k výnimke. Po ďalších niekoľkých hodinách zbesilého skúmaní sme vylúčili chybu v kóde ostávala jediná možnosť - musí to robiť komponenta na správu obrázkov. A čuduj sa svete, ona si naozaj niekedy odpľul niekam do pamäte, ktorá ju nepatrila. Komponent sa volala delfi_listbox a umožňovala do listbox vložiť obrázky. Používal som ju, pretože v Delphi 7 nebola žiadna vstavaná alternatíva. V Delphi 2007 sme našli podobnú komponent priamo od výrobcov, tú som zamenil za delfi_listbox a chyba bola preč.
Aké je teda rozriešenia? Komponent delfi_listbox bola zle napísaná (nie mnou) a v jednom, takmer nevyvolatelném prípade sa snažila zapisovať do pamäte, ktorá ju nepatrila. Staršie Delphi 7 túto chybu neodhalili a nechali ju pretiecť, zhodou náhod niekam, kde majú uložený formulár, ktorý zničila. Výsledkom bolo, že na neho nešlo už nič vložiť.
Programovanie je niekedy hold trochu drina ...
Html: "Ten obrázok tí napravo jednoducho nezaradíme"
Pri aktualizácii webu som do textu vložil obrázok s align = "right" v očakávaní, že ho text bude obtekať. Ale čo sa nestalo - text sa zalomil a obrázok sa zobrazil na samostatnom riadku. Po chvíli laborovaná som si na disku vytvoril textový súbor s príponou htm a do neho napísal len tento riadok:
Toto je skúšobný text <img alt = "" align = "right" src = "obrazek.png">
Výsledok však vyzeral rovnako, ako predtým - obrázok nebol napravo, ale na ďalšom riadku. Čo sa to deje ?! Nakoniec som zistil, že na to má vplyv jeden tag, a to doctype, ktorý som na webe zabudol pripísať a do prázdneho súboru som ho tiež nevložil. Po pridaní riadku
<! DOCTYPE HTML PUBLIC "- W3C DTD HTML 4.01 Transitional // EN" "http://www.w3.org/TR/html4/loose.dtd">
sa všetko zobrazilo normálne. Prehliadače teda bez definície verzia html považujú dokument pravdepodobne za nejaký starý štandard, v ktorom sa asi nedalo zarovnať napravo
DelphiX: "Na niektorých počítačoch sa kosí kurzor myši"
Ďalšie neuveriteľný bug, ktorého hľadanie mi zabralo celý týždeň. Keď som mal svoju hru Bermen takmer dokončenú a dátum nevyhnutného odovzdania bolo za dverami, objavil sa zaujímavý problém: "V počítači suseda sa v hre sekal kurzor myši". Keďže bola hra už po betatestu a nikto tento problém nemal, zviedol som to na nejaký hardvérový problém. V zápätí sa však objavili ďalší dvaja ľudia, ktorým sa hra správala rovnako. Po dôkladnej kontrole kódu (niekoľkých tisícov riadkov ) Som nenašiel jedinú chybu. Rozhodol som sa teda použiť radikálne riešenie. Postupne som odmazával kusy hry a behal za susedom s flashka, kde som skúšal, či sa chyba prejavuje. Na všetkých mojich počítačoch totiž hra fungovala dobre a jeho PC bolo jediné prístupné miesto, kde sa bug prejavoval. Keď z hry nezostalo už nič iné ako prázdne okno s kurzorom myši, kosila sa stále. Keďže som používal delfáckou udalosť onmousemove, stavil som na nekompatibilitu s DelphiX a použil ich implementáciu myši priamo z DirectX input. Rozdiel je v tom, že myš nevracia súradnice na obrazovke, ale len o koľko sa kurzor pohol a na akú stranu (funguje ako joystick). Človek si teda musí napísať niečo na prevod týchto údajov do súradníc a obmedziť, aby kurzor nevyšiel z obrazovky. Výhoda je v tom, že sa dá pracovať so senzitivitou myši. Po tejto úprave hra fungovala bez problému. Oddýchol som si a hru odoslal do súťaže Becherovka game. Bohužiaľ predčasne ...
Po nejakej dobe sa objavili ľudia, ktorým sa hra kosila tiež. Jedným z nich bol Travolta, ktorý mi do hry pomohol vytvoriť doplňujúce 2d grafiku. Prišiel som k nemu s notebookom a snažil sa prísť na príčinu tak extrémneho spomalenie hry, ktoré sa prejavovalo dokonca len v niektorých lokáciách. Po popoludní strávenom ďalšou kontrolou oných tisícov riadkov sa nič nezmenilo. Dospel som k záveru, že výskyt chyby nemá žiadny pravidelný vzorec a nie je na ničom závislý, skoro to vyzeralo, akoby si to náhodne vybralo miestnosti, kde hra nebude fungovať. Zviedol som to na to, že niekde musí pretekať dynamické pole, čo som ale po ďalších kontrolách vylúčil. Po niekoľkých dňoch strávených zbesilým hľadaním na internete a prechádzaním kódu enginu som sa uchýlil k tutoriálům, vytvorených samotným tvorcom komponenty DelphiX. A čoho som si nevšimol! Formulár ukážkového programu bol typu tDxForm (Form1: tDxForm) a nie tform, ako som mal ja. Dočítal som sa, že tdxform je upravená trieda delfáckého formuláre pre handlovania nejakých volanie Directu X. Keď som to pri sebe zmenil - všetko fungovalo!
Týmto by som chcel zanadávať všetkým autorom Delphi X tutoriálov (Hlavne na Naživo a Builder), kde v návode typu vytvorte formulár a natiahnite plátno nie je ani zmienka o zmene triedy formulára. Nepíšte o niečom, čomu nerozumiete!
A ako to dopadlo s hrou? Do súťaže som ihneď odoslal opravu, ale bolo mi povedané, že hra sa bude hodnotiť tak, ako bola do termínu zaslaná a oprava sa iba potom uvoľní k stiahnutiu. Celé dva mesiace som dúfal, že sa chyba neprejaví a moje prosby boli vyslyšané - Bermen vyhral druhé miesto a 35.000 kč, žiadny z porotcov nemal s hrou problém.
Suma sumárum: Beh DelphiX na bežnom formulári mal nevysvetliteľný vplyv na plynulosť hry, ktorá sa zasekávala v náhodných, nesúvisiacich, ale vždy rovnakých miestnostiach. Nikto by mi asi nepovedal, čo sa vtedy presne dialo, ja som sa uspokojil klasickým vysvetlením s vytekaním pamäte.