Главная arrow Начинающим arrow FAQ по языку Си arrow 10. Можно ли как-то сделать массив функций, чтобы вызывать нужную по индексу?  
25.09.2017 г.
Главная
Проекты
Статьи
Начинающим
Архив новостей
Ссылки
Контакты
Поиск
Файлы
Форум
Карта сайта
Авторизация





Забыли пароль?
Ещё не зарегистрированы? Регистрация
Поддержи наш сайт!
Через WebMoney

 R785211844650
 Z210696637574
 E368177590409

Простые устройстваОтличные товары по превосходным ценамОтличные товары по превосходным ценам
10. Можно ли как-то сделать массив функций, чтобы вызывать нужную по индексу? Печать E-mail
Рейтинг: / 7
ХудшаяЛучшая 
Автор ARV   
18.12.2009 г.

Да, конечно, если помнить, что идентификатор функции есть указатель! Правда, указатель этот имеет весьма непростой тип и определяется по следующему шаблону:

тип_результата_функции (*имя_указателя) (список_типов_параметров_функции);

Например, пусть нужно определить указатель funcptr на функцию с тремя параметрами типа int, возвращающую результат типа char:

char (*funcptr) (int,int,int);

Теперь можно присвоить этому указателю значение, равное адресу какой-либо подходящей функции:

char foo(int x, int y, int z){
   return (x + y * z) >> 8;
}
funcptr = foo;
char result = funcptr(1,2,3);

Для создания массива указателей на функции лучше сразу определить тип для соответствующего указателя, а затем уже создать массив из элементов этого типа:

typedef char (*funcptr_t)(int,int,int);
funcptr_t func_array[5]; // массив из 5-и указателей на наши функции

Важно помнить, что при записи funcptr() произойдет вызов функции, а при записи funcptr будет взят адрес этой функции. Т.е. наличие круглых скобок - обязательный признак обращения к функции.


Добавить в любимые (0) | Просмотров: 6739

  Коментарии (3)
 1 Написал(а) Денис Громов, в 15:53 09.03.2011
Вот если бы эту статью я прочел вчера часиков в 11 вечера, я бы сэкономил два с половиной часа драгоценнейшего ночного времени. =)
 2 Написал(а) Степа, в 13:06 21.01.2015
Не могли бы Вы привести пример дальнейшего использования Func_array[i]&
 3 Написал(а) ARV, в 22:32 07.04.2016
Пример массива функций нужен? Для упомянутого в статье массива можно вызвать 3-ю функцию массива так: 
char result = func_array[3](1,2,3); 
 
а вообще для вопросов есть форум.

Только зарегистрированные пользователи могут оставлять коментарии.
Пожалуйста зарегистрируйтесь или войдите в ваш аккаунт.

 
« Пред.   След. »
Полезные материалы по сходным темам
Кто на сайте?
Помощь on-line
BannerFans.com