Warning: Declaration of action_plugin_subjectindex_indexer::register(&$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/subjectindex/action/indexer.php on line 15

Warning: Declaration of action_plugin_mathjax_enable::register(Doku_Event_Handler &$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/mathjax/action/enable.php on line 62

Warning: Declaration of action_plugin_googleanalytics::register(&$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/googleanalytics/action.php on line 40

Warning: Declaration of action_plugin_folded::register(&$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/folded/action.php on line 40

Warning: Declaration of action_plugin_hidden::register(&$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/hidden/action.php on line 28

Warning: Declaration of action_plugin_include::register(&$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/include/action.php on line 354

Warning: Declaration of action_plugin_tag::register(&$contr) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/tag/action.php on line 175

Warning: Cannot modify header information - headers already sent by (output started at /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/subjectindex/action/indexer.php:15) in /data/web/virtuals/28604/virtual/www/subdom/bo/inc/auth.php on line 532

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /data/web/virtuals/28604/virtual/www/subdom/bo/inc/auth.php on line 818

Warning: Cannot modify header information - headers already sent by (output started at /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/subjectindex/action/indexer.php:15) in /data/web/virtuals/28604/virtual/www/subdom/bo/inc/actions.php on line 656

Warning: Cannot modify header information - headers already sent by (output started at /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/subjectindex/action/indexer.php:15) in /data/web/virtuals/28604/virtual/www/subdom/bo/inc/actions.php on line 656
jazykc:ukazatele-na-funkce

====== Ukazatele na funkce ====== * [[dox>ukazatele-na-funkce/mapovani-funkce.c|Mapování_funkce]] * [[dox>ukazatele-na-funkce/mapovani-pole-funkci.c|Mapování_pole_funkcí]] * [[dox>ukazatele-na-funkce/akumulator.c|Akumulátor]] * FIXME než "umělé" příklady udělat příklady na [[die.net>3/qsort]], [[die.net>3/bsearch]] * [[dox>ukazatele-na-funkce/stdlib-qsort.c|stdlib.h qsort()]] [[die.net>3/qsort]] * vysvětlit termím //callack// !!! * příklad na expat! * možná taky compare callback, dispoze callback, userdata/clientData, * "methoda" -- funkční pointer jako //member// struktury =====Deklarace ukazatele na funkci===== V jazyku C je při deklaraci proměnné typu ukazatel na funkci nutné vždy specifikovat také počet a typy parametrů funkce a typ návratové hodnoty. Příklad <del>deklarace</del>definice: <code c> // v------v----------- priotita! double (*p_fdd)(double); // ^------^--- typ </code> FIXME: odkaz na to, jak se čtou deklarátory/typy!!! Uvědomte si: ( závorky ) představují 4 různé operátory: * typ (v deklaraci/definici/přetypování) * operátor provedení/zavolání funkce * [[:c:cast|přetypování]] //cast// * změna priorit, např. a = (3 + 4) * 5; Proměnná p_fdd je ukazatel na funkci s jedním paramaterm typu double vracející hodnotu typu double. Příklad <del>deklarace</del>definice s inicializací: <code c> double polynomA(double x){ return 3 * x * x + 4 * x - 10; } double (*p_fdd)(double) = polynomA; </code> Příklad deklarace pomocí typedef: <code c> typedef double (*P_FDD)(double); P_FDD p_fdd = polynomA; </code> =====Práce s ukazatelem na funkci===== Příklad přiřazení adresy funkce ukazateli: <code c> p_fdd = polynomA; </code> Příklady volání funkce pomocí ukazatele: <code c> v = (*p_f)(-1); v = p_f(-1); </code> Obě výše uvedené možnosti volání funkce pomocí ukazatele na tuto funkci se nijak neliší, v praxi se používá druhá varianta, která je jednodušší. =====Ukazatel na funkci jako parametr funkce===== Ukazatele na funkce umožňují vytváření funkcí vyšších řádů, jejichž výpočet je možné za běhu programu modifikovat pomocí funkcí, které jim jsou předány při jejich volání jako parametr. Příklad definice: <code c> double *map(double (*fce)(double), double *vstup, int pocet) {...} </code> Příklad volání funkce: <code c> double na3(double x){ return x * x * x; } ... pole_vysledku = map(na3, pole_vstupni, velikost_vstupni); //Příklad použití ukazatele na funkci při volání: double (*p_na3)(double) = na3; ... pole_vysledku = map(p_na3, pole_vstupni, velikost_vstupni); </code> =====Pole ukazatelů na funkce===== Stejně jako u všech dříve zmíněných datových typů, je i z ukazatelů na funkce (se stejným počtem a typy parametrů a stejným typem návratové hodnoty) možné vytvářet pole (i vícerozměrná). Příklad deklarace pole ukazatelů na funkce: <code c> double(*pole_fci[5])(double); </code> Příklad deklarace s inicializací: <code c> double(*pole_fci[])(double) = {na3, na4, sin, cos, tan}; </code> Příklad deklarace s použitím dříve definovaného typu: <code c> P_FDD pole_fci[] = {na3, na4, sin, cos, tan}; </code> Příklad volání funkce z pole: <code c> vysledek = pole_fci[1](-1); </code> ---- cc,upol