Externá funkcia je objekt v systéme D2000, ktorý umožňuje rozšíriť štandardnú množinu funkcií, ktoré ponúka matematický aparát. Objekt Externá funkcia reprezentuje exportovanú funkciu v dynamicky linkovanej knižnici (súbore). Vhodnou implementáciou externých funkcií je možné nahradiť (prípadne aj zjednodušiť) rozšírenia systému implementované rozhraniami D2000 ObjApi alebo D2000 KomAPI.
Vytvorenie Externej funkcie spočíva v dvoch krokoch:
- Implementácia funkcie v rámci dynamicky linkovanej knižnice.
- Definovanie objektu typu Externá funkcia.
Implementácia funkcie
Externé funkcie pre systém D2000 je možné písať v jazyku C++ a pre ich implementáciu je potrebné použiť dodávanú knižnicu D2ExtFunc. Spolu s ňou je dodávaný aj príklad knižnice externých funkcií (adresár utils/d2extfunc/sample v inštalačnom adresári D2000), z ktorého pochádza aj nasledovný príklad implementácie externej funkcie.
int DemoRedim(SyncRoutedFunctionParams& params) { // Kontrola parametrov: prvý musí byť štruktúra, druhý jednoduché celé číslo if (params.getCount() != 2 || !params[0].isStructured() || !params[1].isSimple() || params[1].getType() != Integer) return CallError; // Zlý počet alebo typy parametrov - generuje runtime výnimku v ESL // Ak je parameter udávajúci nový rozmer štruktúry platný, if (params[1].isValid()) { // tak zmení rozmer štruktúry params[0].setRowsCount(params[1].getValueInteger()); for (int i = 1; i < params[0].getRowsCount(); ++i) { // a skopíruje hodnoty z prvého riadku do všetkých ostatných for (int j = 0; j < params[0].getColumnsCount(); ++j) { params[0].copyValue(params[0], 0, j, i, j); } } } // Volanie externej funkcie bolo úspešné return CallSuccess; }
Ošetrenie chybových stavov a výnimiek
Vykonávanie externých funkcií prebieha v rovnakom prostredí ako bežia ESL skripty, ktoré ich volajú. Ak vykonávanie externej funkcie skončí odchytitelnou C++ výnimkou, je táto výnimka zachytená a do ESL propagovaná ako runtime chyba. Avšak niektoré chyby v C++ (napr. dereferencia NULL, delenie 0) negenerujú odchytitelné výnimky a končia pádom knižnice a procesu, ktorý knižnicu používa (Event handler), preto je pri implementácii externých funkcií potrebné dôsledne dbať na ošetrenie chybových stavov.
Príklad volania externej funkcie
BEGIN RECORD NOALIAS (SD.ExtFunc) _rec CALL %DemoRedim(_rec, 10) END
Súvisiace stránky: