Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Массивы указателей на функцию



В некоторых типах программ пользователь может выбирать некоторый вариант из списка возможных действий. Например, в системе подсчета может быть меню более с 20 вариантами. Когда выбор сделан, программа выполняет соответствующую функцию. Это может быть сделано двумя способами. Во первых, для этого можно использовать оператор switch, например

void menu(void)

{

char ch;

printf(“1. Проверка орфографии\n”);

printf(“2. Корректировка ошибок\n”);

printf(“3. Вывод ошибок на экран\n”);

printf(“Сделайте ваш выбор: “);

do {

ch = getche(); /* Чтение клавиатуры */

switch (ch) {

case ‘1’:

check_spelling();

break;

case ‘2’:

correct_errors();

break;

case ‘3’:

display_errors();

break;

}

} while (ch!= ‘1’ && ch!= ‘2’ && ch!= ‘3’);

}

В приложениях, где требуется высокая производительность, лучше применять другой способ. Можно использовать массив указателей, содержащих адреса функций. Выбор, сделанный пользователем, декодируется и используется для индексации массива указателей, вызывая выполнение необходимой функции. Этот метод гораздо быстрее, чем метод использования оператора switch.

Для того, чтобы понять, как можно использовать массив указателей на функции для построения меню, преобразуем предыдущий пример. Если функции, выполняющие действия по проверке орфографии называются check_spelling(), correct_errors(), display_errors(), quit(), то следующий фрагмент программы корректно инициализирует массив указателей на функции:

void check_spelling (void), correct_errors (void), display_errors (void), quit (void);

int menu (void);

void (*options[ ]) (void) = {

check_spelling,

correct_errors,

display_errors,

quit

};

Необходимо обратить особое внимание на способ объявления массива указателей на функции, а также на использование круглых и квадратных скобок.

Хотя эта программа не выполняет никаких действий по проверке орфографии, она демонстрирует правильный способ выполнения функций с помощью указателей на функции. Следует обратить внимание, как функция menu() автоматически возвращает правильный индекс в массив указателя:

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

void check_spelling (void), correct_errors (void), display_errors (void), quit (void);

int menu (void);

void (*options []) (void) = {

check_spelling,

correct_errors,

display_errors,

quit

};

int main(void)

{

int i;

i = menu (); /* получение выбора пользователя *.

(*options [i]) (); /* выполнение */

return 0;

}

int menu (void)

{

char ch;

do {

printf(“1. Проверка орфографии\n”);

printf(“2. Корректировка ошибок\n”);

printf(“3. Вывод ошибок на экран\n”);

printf(“4. В ы х о д\n”);

printf(“Сделайте ваш выбор: “);

ch = getche();

printf(“\n”);

} while (!strchr (“1234”, ch));

return ch – 49; /* преобразование к целочисленному эквиваленту */

}

void check_spelling (void)

{

printf(“In check_spelling”);

}

void correct_errors (void)

{

printf(“In correct_errors”);

}

void display_errors (void)

{

printf(“In display_errors”);

}

void quit (void)

{

printf(“In quit”);

exit(0);

}

Программа работает следующим образом. Сначала на экран выводится меню и пользователь вводит число, соответствующее его выбору. Поскольку введенное число представлено в ASCII-коде, то необходимо вычесть 49 (ASCII-код цифры 0) для получения двоичного числа. Данное значение затем возвращается в main () и используется как индекс массива options – массива указателей на функцию. После этого вызывается соответствующая функция. Строковая функция strchr (“1234”, ch) возвращает указатель на первое вхождение символа ch в строку “1234”.





Дата публикования: 2015-10-09; Прочитано: 259 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...