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.

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
Write a comment...