Покажчики на функції як параметри - студопедія

Покажчики на функції як параметри дозволяють созда-вать функції, що реалізують той чи інший метод обробки дру-гой функції, яка заздалегідь не визначена. Наприклад, можна визначити функцію для обчислення певного інтеграла. Підінтегральна функція може бути передана в функцію ви-числения інтеграла за допомогою параметра-покажчика. Приклад функції для обчислення певного інтеграла за допомогою формули прямокутників:

double rectangle (double (* pf) (double), double a, double b)

Параметри функції rectangle (): pf - покажчик на функцію з параметром типу double, що повертає значення типу double. Це покажчик на функцію, яка обчислює значення подинте-дробові функції при заданому значенні аргументу. Парамет-ри a, b - межі інтегрування. Число інтервалів розбиття відрізка інтегрування фіксоване: N = 20. Нехай текст функ-ції під ім'ям rect.c збережений в каталозі користувача.

Запропонуємо, що функція rectangle () повинна бути вико-вана для обчислення наближених значень інтегралів.

Програма для вирішення цього завдання може мати іду щий вид:

#include "rect.c" / * Включення визначення функції rectangle () * /

double ratio (double x) / * Підінтегральна функція * /

double z; / * Допоміжна змінна * /

double cos4_2 (double v) / * Підінтегральна функція * /

double w; / * Допоміжна змінна * /

int _tmain (int argc, _TCHAR * argv [])

printf ( "\ n Перший інтеграл:% f", c);

printf ( "\ n Другий інтеграл:% f", rectangle (cos4_2,0.0,0.5));

Результат виконання програми:

Перший інтеграл: 0.149847

Другий інтеграл: 1.841559

Директива #include "rect.c" включає на етапі препроцесорної обробки в програму визначення функції rectangle (). Передбачається, як згадано вище, що текст цього визна-лення знаходиться в файлі rect.c.

Визначення функцій ratio () і cos4_2 (), що дозволяють ви-яка значиться значення подинтегральних виразів по заданому значенню аргументу, нічим не примітні. Їх прототипи відповідають вимогам специфікації першого параметра функції rectangle ():

double ім'я (double)

В основній програмі main () функція rectangle () викликаючи-ється двічі з різними значеннями параметрів. Для разнообра зія виклики виконані по-різному, але кожен раз перший пара-метр - це ім'я конкретної функції, тобто константний вказівник на функцію.

4. Покажчик на функцію як повертається функцією зна-чення

Розглянемо програму, яка демонструвала б особливості той-який організації меню.

У програмі визначено три функції: перші дві функції f1 () і f2 () з прототипом виду

(Порожній список параметрів, повертається значення типу int) і третя функція menu () з прототипом

int (* menu (void)) (void);

яка повертає значення покажчика на функції з порожніми списками параметрів, які повертають значення типу int.

При виконанні функції menu () користувачеві дається мож-ливість вибору з двох пунктів меню. Пунктами меню соот-ветствуют певні вище функції f1 () і f2 (), покажчик на одну з яких є повертається значенням. Прі не-вірному виборі номера пункту повертається значення становит-ся рівним NULL.

printf ( "The first actions:");

Pick the menu item (1 or 2): 2

The second actions: t = 2

Pick the menu item (1 or 2): 1

The first actions: t = l

Pick the menu item (1 or 2): 24

У функції menu () визначено масив menu_items [] указат-лей на функції. Як ініціюючих значень в списку використані імена функцій f1 () і f2 ():

Таке визначення масиву покажчиків на функції по мень-шей мірою не дуже наочно. Спростити такі визначення можна за допомогою допоміжних позначень (імен), вво-дімих специфікатором typedef.Напрімер, те ж саме визна-ня масиву покажчиків можна ввести так:

typedef int (* Menu_action) (void);

Тут typedef вводить позначення Menu_action для типу "вка-затель на функції з порожнім списком параметрів, повертаю-щие значення типу int".

Схожі статті