Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцииЛаб(Часть_2_Книги).doc
Скачиваний:
4
Добавлен:
03.05.2019
Размер:
988.16 Кб
Скачать

§3. Массив указателей на функции.

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

float (*FunArray) (char, char) [5]; ?????

описывает массив фиксированной размерности из пяти указателей на функции, каждая из которых имеет два параметра типа char и возвращает значение типа float. Как для обычных массивов, индексация начинается с нуля. Поэтому для обращения к третьей из этих функций потребуется, например, такой оператор:

float f= (*FunArray[2]) (‘A’, ‘B’);

Массив указателей на функции удобно использовать при разработке программ, управление которыми выполняется с помощью меню. Для этого действия, предлагаемые на выбор пользователю программы (например, создание файла, чтение и анализ, корректировка файла), оформляются в виде функций, адреса которых помещаются в массив указателей на функции. Пользователь вводит номер выбираемого пункта и по нему из массива выбирается соответствующий адрес функции. Обращение к функции по этому адресу обеспечивает выполнение требуемых действий. Благодаря такому методу программирования нет необходимости выбирать соответствующие функции с помощью оператора switch. Общая схема реализации такого подхода иллюстрирует следующая программа:

Пример 1. Статический массив указателей на функции.

void Create (int);

void Read(int);

void Append(int);

void main()

{ const n=3;

// Объявляем массив из трёх указателей на функции

void (*far[n])(char *)= { Create, Read, Append };

int Numf;

char NameOfFile[30];

cout<<”\n 1- CREATE”;

cout<<”\n 2- READ”;

cout<<”\n 3- APPEND”;

cout<<”\n 4- EXIT”;

while (1)

{ while (1)

{ cout<<”\n Item of menu”; cin>>Numf

if (Numf>=1 && Numf<=4) break;

cout<<” \n Error! Repeat/ “;

}

if (Numf==4) break;

else

{cout<<”\n Name of file “;

gets( NameOfFile);

(*far[Numf-1])( NameOfFile);

}

}

}

void Create (int x)

{ cout << " Creating of file"<<endl;

}

void Read (int x)

{ cout << " Reading of file"<<endl;

}

void Append (int x)

{ cout << " Appending of file"<<endl;

}

В этом учебном, искусственном примере объявили массив far из трёх указателей на функции типа void, каждая из которых имеет один входной параметр (физическое имя обрабатываемого файла) типа указателя на строку (char *). Функция ничего не возвращает, а только выводит текст в зависимости от выполняемых над файлом действий. При объявлении массива выполнена инициализация тремя конкретными, определёнными после main(), функциями Create, Read и Append. В цикле вводим номер функции (1, 2, 3 или 4 для выхода) и выполняем одну из трёх функций. В качестве параметра в конкретную функцию передаётся её реальный номер в массиве (1 для Create, 2 для Read, и 3 для Append ). Если введём в качестве номера число 4 выходим из внешнего цикла.

Пример 2. (+) Динамический массив указателей на функции. Для x=0, 0.2, …, 1 вывести таблицу значений трёх функций.

// Тексты двух функций. Третья функция – стандартная cos(x).

double MyExp (double x){

return (exp(x));

};

double Myq(double x){

return x*x;

};

void main()

{ int n; cin>>n;

/* Объявляем и создаём массив указателей на функции с одним вещественным параметром. */

double (*(*fun))(double )= new (double (*[n])(double));

// Элементам созданного массива присваиваем имена функций.

fun[0]= cos;

fun[1]=MyExp;

fun[2]=Myq;

// Цикл для изменения x

for (float x=0; x<1; x+=0.2)

{ printf("%5.1f",x) ;

/* Цикл для вывода значений всех функций для одного фиксированного значения x. */

for(int j=0; j<n; j++)

printf (" %20.6f", fun[j](x));

cout<<endl;

}

getch(); }