Как передать функцию в качестве параметра в C?

Я хочу создать функцию, которая выполняет функцию, переданную параметром в наборе данных. Как передать функцию в качестве параметра в C?

декларация

Прототип функции, которая принимает параметр функции, выглядит следующим образом:

 void func ( void (*f)(int) ); 

Это означает, что параметр f будет указателем на функцию, которая имеет тип возврата void и которая принимает один параметр int . Следующая функция ( print ) – это пример функции, которая может быть передана func в качестве параметра, потому что это правильный тип:

 void print ( int x ) { printf("%d\n", x); } 

Вызов функции

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

 func(print); 

вызовет func , передав ему функцию печати.

Тело функции

Как и любой параметр, func теперь может использовать имя параметра в теле функции для доступа к значению параметра. Предположим, что func применит функцию, которую она передаст к номерам 0-4. Рассмотрим, во-первых, что цикл будет выглядеть так:

 for ( int ctr = 0 ; ctr < 5 ; ctr++ ) { print(ctr); } 

Поскольку в объявлении параметра func указано, что f является именем для указателя на нужную функцию, напомним сначала, что если f является указателем, то *f - это то, что f указывает на (то есть, функция print в этом случае). В результате просто замените каждое появление печати в вышеприведенном цикле: *f :

 void func ( void (*f)(int) ) { for ( int ctr = 0 ; ctr < 5 ; ctr++ ) { (*f)(ctr); } } 

Из http://math.hws.edu/bridgeman/courses/331/f05/handouts/c-c++-notes.html

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

 typedef void (*functiontype)(); 

Объявляет функцию, которая возвращает void и не принимает аргументов. Чтобы создать указатель на этот тип, вы можете теперь:

 void dosomething() { } functiontype func = &dosomething; func(); 

Для функции, которая возвращает int и принимает символ, который вы сделаете

 typedef int (*functiontype2)(char); 

и использовать его

 int dosomethingwithchar(char a) { return 1; } functiontype2 func2 = &dosomethingwithchar int result = func2('a'); 

Существуют библиотеки, которые могут помочь с преrotationм указателей функций в хорошие читаемые типы. Библиотека функций ускорения великолепна и стоит усилий!

 boost::function functiontype2; 

намного лучше, чем выше.

С C ++ 11 вы можете использовать функциональную библиотеку, чтобы сделать это кратким и общим образом. Синтаксис, например,

 std::function 

где bool – это возвращаемый тип здесь функции с одним аргументом, первый аргумент которой имеет тип int .

Я привел пример программы ниже:

 // g++ test.cpp --std=c++11 #include  double Combiner(double a, double b, std::function func){ return func(a,b); } double Add(double a, double b){ return a+b; } double Mult(double a, double b){ return a*b; } int main(){ Combiner(12,13,Add); Combiner(12,13,Mult); } 

Иногда, однако, удобнее использовать функцию шаблона:

 // g++ test.cpp --std=c++11 template double Combiner(double a, double b, T func){ return func(a,b); } double Add(double a, double b){ return a+b; } double Mult(double a, double b){ return a*b; } int main(){ Combiner(12,13,Add); Combiner(12,13,Mult); } 

Передайте адрес функции как параметр в другую функцию, как показано ниже

 #include  void print(); void execute(void()); int main() { execute(print); // sends address of print return 0; } void print() { printf("Hello!"); } void execute(void f()) // receive address of print { f(); } 

Также мы можем передать функцию как параметр, используя указатель функции

 #include  void print(); void execute(void (*f)()); int main() { execute(&print); // sends address of print return 0; } void print() { printf("Hello!"); } void execute(void (*f)()) // receive address of print { f(); } 

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

  • Используется ли для объявлений локальных функций?
  • Могу ли я заставить функцию plpgsql возвращать целое число без использования переменной?
  • Вызов пользовательской функции GAS из внешнего URL-адреса
  • Манипулировать multidimensional array в функции
  • Можно ли определить более одной функции для каждого файла в MATLAB и получить доступ к ним из-за пределов этого файла?
  • Как передать все аргументы, переданные моему скрипту bash, в мою функцию?
  • Почему прототипы функции Perl 5 плохо?
  • Static vs функции / переменные classа в classах Swift?
  • Как вернуть 2 значения из метода Java?
  • Возврат функции VB.NET
  • Что такое представитель underscore в Swift References?
  • Давайте будем гением компьютера.