e-mail    Debatní kniha    Mapa stránek    Hlavní  
 perličky 
 

Geniální myš nemá ráda Borland

RNDr. Michael Eckstein

Asi znáte slavnou větu z Murphyho zákonů: Věta 1 -- V každém programu je chyba. Z této Věty 1 vyplývá také její důsledek. Důsledek: Po odstranění chyby platí nadále tvrzení Věty 1.

Tyto věty jsou ověřovány každodenní praxí při práci u počítače. S chybami v programech se každý vyrovnává po svém, záleží na naturelu. Reklamace u výrobce často nevede k opravení chyby, zvláště jde-li o zahraniční program. Většinou si člověk poradí sám a chybu nějak obejde, někdy i po konzultaci s dalšími uživateli téhož programu. Příčiny chyb v programech jsou velmi různorodé. Seznámím vás s jednou zákeřnou chybou, která se začala vyskytovat v poslední době náhle a nečekaně v různých programech do té doby pracujících bez této chyby. Její náprava je poměrně snadná.

Chyba se projevuje několika způsoby. V prvním případě se po spuštění programu na monitoru objeví rozházený obraz, který může být předzvěstí následné katastrofy. Ve druhém případě se závada projeví tak, že po chvíli práce s programem se zblázní myš a kurzor myši začne zmateně pobíhat po obrazovce a náhodně indikovat zmáčknutí tlačítka myši. Myš zůstane splašená i tehdy, pokud program opustíme a spustíme jiný program používající myš. Navíc pomůže vytažení myši z konektoru a její zpětné zasunutí při současném zmáčknutém tačítku myši - myš se pak zklidní a pracuje dále bezchybně. Zdálo by se tedy, že chyba je v hardwaru myši nebo v portech počítače.

Zkoumali jsme, čím by toto mohlo být způsobeno. To, že program pracuje na jednom počítači dobře a na jiném počitači stejného typu se stejnými soubory AUTOEXEC.BAT i CONFIG.SYS, ba i stejným operačním systémem špatně, svádělo k logické domněnce, že jde o závadu hardwaru. Výzkum nebyl jednoduchý a řešení je poučné.

Příčina obou těchto chyb je v kolizi driveru myši Genius s programem, napsaným alespoň částečně pomocí Borland C++ 3.1. Zajímavé je zvláště to, že závady se neprojeví, pokud je instalován Genius mouse driver 9.04 a nižší. Zkoušeli jsme verze 9.06 a 9.10, kde se projevuje pouze druhá chyba. Při instalované verzi 9.20 se již objevují obě chyby. První chyba je pikantní v tom, že se vyskytne nezávisle na tom, zda program používá myš nebo ne!

Pro programátory v Borland C++ 3.1 uvedu konkrétní příklady, kdy se chyby projevují, aby se jim mohli při programování vyhnout. Druhá chyba vznikne tehdy, když je v programu vícekrát inicializována myš -- funkce 0: Reset genius mouse driver. První chybu ilustruje výpis krátkého programu, který s driverem 9.20 pracuje chybně:

#include <conio.h> /* prototyp funkce KresliOkno */ void KresliOkno(int x1, int y1, int x2, int y2); int main(void) { KresliOkno(10,10,40,15); return(1); } /* Procedura vykreslí červený obdélník s textem. */ /* Pro genius mouse driver verze 9.04 se vypíše */ /* text na poslední řadek v obdélníku. */ /* Pro genius mouse driver verze 9.20 se vypíše */ /* text chybně na prvním řádku v obdélníku.*/ void KresliOkno(int x1, int y1, int x2, int y2) { textbackground(RED); window(x1,y1,x2,y2); clrscr(); gotoxy (4,y2-y1+1); cprintf("Zapisuji na spodni radek"); }

Z důvodu nedostatku čase jsme nezkoumali, zda je původ chyby v driveru myši, nebo zda je její původ ve špatné funkci překladače Borland C++ 3.1; pro řešení problému to však není podstatné. Chyby jsme odstranili vlastními moduly nahrazujícími některé funkce překladače. Zjistili jsme, že kolize vzniká při volání funkcí clrscr a clreol. Uvádíme výpisy náhradních funkcí, kterými jsme nahradili původní funkce:

#include <\borlandc\crtl\rtlinc\_video.h> void clrscr(void) { _AH = 6; _AL = _video.windowy2-_video.windowy1+1; _CH = _video.windowy1; _CL = _video.windowx1; _DH = _video.windowy2; _DL = _video.windowx2; _BH = _video.attribute; _BL = 0; asm INT 10H _AH = 2; _BH = 0; _DH = _video.windowy1; _DL = _video.windowx1; asm INT 10H } void clreol(void) { int sloup; _AH = 0x03; _BH = 0; asm INT 10H sloup = _DL; if (sloup <_video.windowx1 || sloup > _video.windowx2) return; sloup = _video.windowx2 - sloup + 1; _AH = 0x09; _AL = ' '; _BH = 0; _BL = _video.attribute; _CX = sloup; asm INT 10H }

Z uvedeného popisu vyplývá také náhradní triviální metoda odstranění těchto závad uživatelem programu. Stačí pouze zaměnit driver vyšší verze za verzi 9.04 a je po problému. Upozorňujeme však, že některé novější myši Genius nepracují se staršími drivery. Ovšem i když závadu odstraníte, Věta 1 z úvodu platí nadále.




Pascal - hlavní
Překladače
Vlastní články
Převzaté články
Věci na stáhnutí
Odkazy k tématu
BP7 buglist
Chyba Run-time 200

BASIC