В некоторых типах программ пользователь может выбирать некоторый вариант из списка возможных действий. Например, в системе подсчета может быть меню более с 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(), то следующий фрагмент программы корректно инициализирует массив указателей на функции:
Необходимо обратить особое внимание на способ объявления массива указателей на функции, а также на использование круглых и квадратных скобок.
Хотя эта программа не выполняет никаких действий по проверке орфографии, она демонстрирует правильный способ выполнения функций с помощью указателей на функции. Следует обратить внимание, как функция menu() автоматически возвращает правильный индекс в массив указателя:
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”.