Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DSD_Spiskovye_struktury_dannykh_na_baze_massivo...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

4.4.3Вызов функции через бестиповый указатель на функцию

Для вызова функции через бестиповый указатель на эту функцию вначале выполняется преобразование переменной-указателя на функцию к переменной типа void* и затем выполняется соответствующее присваивание. Например:

typedef

int (*TPFunc) (int , int ); /*TPFunc – тип указателя на функцию*/

void* Ptr;

Ptr = APlusB; /*переменная типа void* (указатель) получает адрес функции*/

или так:

Ptr = &APlusB;

Далее выполняется преобразование указателя Ptr (переменной типа void*) к переменной типа указатель на функцию и выполняется вызов функции.

int rez ;

rez = ((TFunc)Ptr)(a, b); /*вызов функции, через бестиповый указатель*/

4.4.4Преобразование бестипового указателя к переменной типа указатель на функцию

Если по переменной типа void* (указателю) требуется сформировать переменную типа указатель на функцию, например PFunc, необходимо значение бестипового указателя привести к типу указатель на функцию таким образом:

typedef

int (*TPFunc) (int, int); /*TPFunc – тип указателя на функцию*/

. . .

void* Ptr;

TPFunc PFunc;

Ptr = APlusB; /*переменная типа void* (указатель) получает адрес функции*/

Далее выполняется преобразование бестипового указателя Ptr в переменную типа указатель на функцию PFunc.

PFunc = (TPFunc)Ptr;

Далее выполняется вызов функции через указатель на функцию PFunc.

int rez ;

rez = PFunc (a, b);

4.5Способы вызова функции через указатель на функцию

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

Практическим примером использования массивов указателей на функции, является создание меню. Действительно, каждой строке меню соответствует своя функция. В результате рассмотренные ниже массивы, например ArrPtrFunc, могут быть меню-массивами.

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

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

typedef

void (*TPFuncAdd) (& void* , void* ); /*TPFuncAdd – тип указателя на функ-

цию добавления элемента в список*/

typedef

TPFuncAdd TArrPtrFunc [M] ; /* TArrPtrFunc - тип для массива указателей на функции*/

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

Тип указателя на массив указателей на функции. Позволяет указать на набор доступных функций некоторого элемента программы.

TArrPtrFunc * TPtrArrPtrFunc ;

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

Такой массив может располагаться:

  • в статической памяти;

  • в динамической памяти.

Ниже рассматриваются возможные комбинации этих вариантов.

  1. Вызов функции как элемента массива указателей на функции, расположенного в статической памяти.

    1. инициализация массива указателей на функции:

TArrPtrFunc ArrPtrFunc;

ArrPtrFunc[0] = AddToStartList;

ArrPtrFunc[1] = AddToEndList;

    1. вызов функции:

ArrPtrFunc [0] (BeginList, PNew);

  1. Вызов функции через указатель на массив указателей на функции, расположенный в динамической памяти.

          1. размещение массива указателей на функции в динамической памяти:

TPtrArrPtrFunc PtrArrPtrFunc;

PtrArrPtrFunc = new TPFuncAdd [M];

          1. инициализация массива указателей на функции:

PtrArrPtrFunc[0] = AddToStartList;

PtrArrPtrFunc[1] = AddToEndList;

          1. вызов функции:

PtrArrPtrFunc[0] (BeginList, PNew); //вызов функции