Hledßme chyby ve zdrojov²ch k≤dech

Bě₧nß v²vojovΘ prostředφ nejen ₧e dokß₧φ přelo₧it zdrojovΘ k≤dy, ale umφ i v přφpadě chyb na tyto upozornit a nastavit kurzor na co nejbli₧Üφ mφsto v²skytu. Od verze 2.5 mů₧ete tuto vymo₧enost pou₧φvat i v rkEditu. V nßsledujφcφch řßdcφch bude cel² princip vysvětlen.

 

Ji₧ od verze 1 bylo mo₧nΘ spouÜtět externφ překladač a po jeho dokončenφ otevřφt zvolen² soubor. Tento soubor se otevřel jako dalÜφ ze souborů. Uveden² způsob je stßle pou₧iteln², ale v současnΘ verzi lze zvolit jin² - vylepÜen² - postup.

Při nastavovßnφ překladače či dalÜφch u₧ivatelsk²ch přφkazů lze kromě jinΘho zadat tvz. Log file. Jednß se o libovoln² soubor, typicky v²stup překladače, kter² se po ukončenφ překladu či běhu jinΘ aplikace zobrazφ ve specißlnφm okně pojmenovanΘm Output window (V²stupnφ okno). Jednß se o okno, kterΘ se zobrazφ v dolnφ čßsti editoru (viz obrßzek).

 

To by ovÜem nebylo nijak zajφmavΘ, pokud by to bylo vÜe, co to umφ. Pokud si obrßzek prohlΘdnete podrobněji, zjistφte, ₧e podle textu ve V²stupnφm okně je označen červeně řßdek, kter² určuje chybu. Jak k tomu doÜlo?

 

Po načtenφ dat z logovacφho souboru se rkEdit podφvß do adresßře DLLs, zda tam nenφ knihovna, kterß odpovφdß aktußlnφmu typu souboru (viz typy souborů). Pokud ano, předß se jφ text z logovacφho okna, ona jej zanalyzuje a pokud je to mo₧nΘ, vrßtφ pozici ve zdrojovΘm textu, kde k chybě doÜlo.

 

Standardnφ äbalenφô rkEditu obsahuje takovouto podporu pro kontrolu validnosti XML dokumentu (bli₧Üφ informace jak tuto funkci nastavit hledejte v tΘmatu Podpora XML). V nßsledujφcφm textu si ukß₧eme, jak si napsat vlastnφ určenφ mφsta chyby.

 

Vlastnφ určenφ mφsta chyby (programßtorskß dokumentace)

Vzhledem k tomu, ₧e ani nedokß₧i zjistit, jakΘ překladače kdo pou₧φvß, nato₧ jakΘ majφ v²stupy, mß ka₧d² mo₧nost napsat si vlastnφ implementaci určenφ mφsta chyby. Stačφ k tomu libovoln² překladač pro 32-bitovß Windows (Delphi, C++ Builder, MS Visual Studio, ...), jeho₧ v²sledkem mů₧e b²t DLL knihovna.

Jak mß DLL knihovna vypadat

V adresßři Develop jsou umφstěny čtyři soubory:

 

V souborech LogAnalyzatorsTypes.pas (pro Delphi) a LogAnalyzatorsTypes.h (pro C a C++) jsou umφstěny dva typy a jedna konstanta. Pokud se rozhodnete napsat si vlastnφ DLL, musφte exportovat funkci s nßzvem GetCapability(), kterß vrßtφ zßznam typu TrkEditCapability. Zßznam TrkEditCapability obsahuje dvě slo₧ky:

 

Druhou funkcφ, kterß musφ b²t exportovßna, je GetXYOfFirstError. TΘto funkci se jako jeden parametr dß text, kter² byl zφskßn z logovacφho souboru a ona vrßtφ jednak pozici chyby ve zdrojovΘm textu a pak pozici, kam se mß posunout kursor ve v²stupnφm okně (posun ve v²stupnφm okně nenφ zatφm podporovßn, jednß se pouze o přφpravu pro dalÜφ verzi rkEditu). Podle hodnoty ve slo₧ce SupportedFunctionType se rkEdit dozvφ, jak²m způsobem mß předat text z logovacφho souboru funkci GetXYOfFirstError. Ta mů₧e mφt tedy dva tvary:

 

Zßpis v Delphi:

 

function GetXYOfFirstError (const LogString: TStrings; var ErrX, ErrY, LogX, LogY: integer): integer; stdcall;

 

resp.

 

function GetXYOfFirstError (const LogString: PChar; var ErrX, ErrY, LogX, LogY: integer): integer; stdcall;

 

Zßpis v jazyce C:

 

extern "C" __declspec(dllexport) int GetXYOfFirstError (const char *Text, int *ErrX, int *ErrY, int *LogX, int *LogY);

 

resp.

 

extern "C" __declspec(dllexport) int GetXYOfFirstError (const TStrings *Text, int *ErrX, int *ErrY, int *LogX, int *LogY);

 

Tvar s parametrem typu TStrings je určen pro překladače společnosti Borland a jejich knihovnu VCL. Parametr typu PChar je určen pro libovolnΘ překladače umo₧ňujφcφ tuto datovou strukturu, pro Windows nativnφ.

 

Funkce GetXYOfFirstError tedy zanalyzuje text, kter² dostane, a vrßtφ přφpadnou pozici ve zdrojovΘm textu a ve v²stupnφm okně. Nßvratovß hodnota v přφpadě ·spěchu je 0 (nula), jinak je nenulovß.

 

Pro ka₧d² typ souboru je potřeba mφt vlastnφ DLL umφstěnou v adresßři DLLs a pojmenovanou podle tabulky uvedenΘ zde.

 

Důle₧itΘ upozorněnφ: V přφpadě, ₧e si napφÜete vlastnφ DLL, ve kterΘ budou chyby, nemohu v ₧ßdnΘm přφpadě zaručit, ₧e se rkEdit bude chovat korektně (zßle₧φ na zßva₧nosti chyby). Dbejte proto na to, aby jste v knihovně ₧ßdnou chybu neměli.

 

Přφklad DLL

V souborech xml.dpr a xml.cpp jsou přelo₧itelnΘ ukßzky, jak lze tΘto technologie vyu₧φt (ostatně soubor xml.dll je překladem souboru xml.cpp). Tvorba DLL souboru v Delphi je poměrně přφmočarß a jasnß, proto se tu tφm nebudu zab²vat, ostatně přφklad je samovypovφdajφcφ.

 

ZajφmavějÜφ je to s překladačem jazyka C, resp. C++. Dφky společnosti Borland lze zφskat zdarma legßlnφ řßdkov² překladač prßvě jazyka C a C++ pro platformu Windows. Po jeho sta₧enφ a nainstalovßnφ je potřeba jeÜtě vlo₧it cestu do adresßře Bin do systΘmovΘ proměnnΘ PATH. Pokud jste napřφklad vÜe nainstalovali do adresßře C:\CPP55, pak do proměnnΘ PATH přidejte cestu C:\CPP55\BIN. Nynφ stačφ vzφt soubory xml.cpp a LogAnalyzatorsTypes.h a přelo₧it je nßsledujφcφm přφkazem:

 

bcc32.exe -tWD -ps -IC:\CPP55\Include -LC:\CPP55\Lib xml.cpp

 

 

V²sledkem je knihovna XML.DLL, kterou je potřeba umφstit do adresßře DLLs.

 

DalÜφ konkrΘtnφ informace k souboru XML.DLL, resp. jak pou₧φt tuto knihovnu (či dalÜφ) v prostředφ rkEditu,  je uvedeno v tΘmatu Podpora XML.

 

Budoucnost

V některΘ z přφÜtφch verzφch chci tuto technologii značně rozvΘst do podoby hledßnφ předchozφ či nßsledujφcφ chyby, nevßzat se pouze na jedin² zdrojov² soubor a dalÜφ.