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čí odchytiteľnou 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ú odchytiteľné 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:
Pridať komentár