
- •11.5.1. Масиви - параметри функцій
- •11.5.2. Символьні рядки - параметри функцій
- •Int day; /* на зовнішньому рівні */
- •11.8. Опрацювання структур у функціях
- •11.9.1. Оголошення вказівника на функцію. Звертання через вказівник
- •11.9.2. Вказівник на функцію як параметр функцій
- •11.9.3. Функції, що повертають вказівник на функцію
- •11.9.4. Масиви вказівників на функцію
- •Void Menu (void);
- •Int main (void)
- •Void Menu (void) /* функція формування меню */
- •Int nuro, nitems;
- •If (pred — null) (
- •Int* FindElement (int nfind, int arr[], int k)
- •If (*pel «nfind) return pel; /* число знайдено */
- •11.11.2. Макрозасоби для роботи з неогопошеними параметрами
11.9.4. Масиви вказівників на функцію
Такі масиви є ще одним поширеним застосуванням вказівників на функції. Синтаксична конструкція, що оголошує масив вказівників на функції, повинна мати таку
форму:
тип_значенпя^функції (* ім'я_масиву [кількістьje/іементів] ) (список
типів ^параметрів_функції) ;
Як і у випадку оголошення функцій, шо повертають вказівник на функцію, дане оголошення потребує внутрішніх круглих дужок, щоб операція ' - "вказівник" інтерпретувались перед операцією () - "функція".
Наступне оголошення створює масив вказівників на функції: double (*farray[8])(double);
Такі оголошення читають, починаючи з імені змінної, за правилами, розглянутими раніше. Тобто farray - це масив з восьми елементів, кожен з яких є вказівником на функцію, що має один дійсний параметр і повертає значення з типом double.
Якщо в оголошенні масиву використати задекларований вище тип FUNC, то воно станс значно лаконічнішим:
FUNC * farray[8];
Масиви вказівників нз функції опрацьовуються так само, як і звичайні масиви: їх можна інІціалізувати адресами відповідних функцій, до їхніх елементів можна звертатись через індекси, або через вказівники тощо. Наприклад, якщо виконати присвоєння
farray[0J - funl; farray[1] ■ £un2;
а потім обчислити значення наступного виразу і присвоїти його змінній vf If 2: double vflf2;
vf lf2 - (AverFunValuetO, 2, farrayf 0] ) + AverFunValue(0, 2, farray [1] ) ) 12;
то результат присвоєння дорівнюватиме півсумі середніх значень функцій funl ( ) та f un2 ( ) на проміжку [0, 2].
Основним застосуванням масивів вказівників на функції є створення користувацьких меню та організація т. зв. таблиць переходів (Jump-labiés). Щоб створити масив вказівників на функції, всі розділи меню або виконавчі блоки таблиць переходів оформляють як однотипні функції, тобто функції з однаковим списком параметрів і однаковим типом значення, яке вони повертають. Адреси виконавчих функцій присвоюють елементам масиву вказівників. У процесі роботи програми кожен вибір пункту меню чи перехід до іншого виконавчого блоку перетворюються у номер відповідної функції в масиві вказівників. Відбувається звертання до вибраної функції за її адресою і виконуються дії, встановлені для цієї функції. Така організація вибору потрібної функції вкрай проста -фактично це вибір елемента з масиву вказівників - і дає змогу уникнути громіздких розгалужень, які довелось би реалізовувати через багаторазові звертання до умовного оператора чи через використання оператора switch.
Проілюструємо застосування масиву вказівників прикладом програми, в якій користувач вибирає дії зі запропонованих у простому меню. Щоб зосередити увагу на механізмі вибору функцій, які реалізують пункти меню, в тілі кожної функції меню виконується тільки виведення інформаційних повідомлень, а інші дії закоментовано. Робота програми закінчується, коли виконано пункт меню "Завершення роботи". Особливості організації окремих функцій роз'яснено в коментарях, а після тексту програми наведено додаткові пояснення.
^«**************«***#**********»**************/
/• Приклад організації користувацького меню */ у*****»*.******#********************* *»*****••/
#include <stdio.h> •include <conio.h>
typedef void ACTION {void * pred); /* тип Функцій меню */
ACTION Iteml; /* прототипи функцій */
ACTION Item2;
ACTION Item3;
ACTION Exitltem;