Вопрос

Я хочу создать функцию, которая выполняет функцию, переданную параметром, для набора данных.Как передать функцию в качестве параметра в 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.Сначала рассмотрим, как будет выглядеть цикл для прямого вызова print:

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

С тех пор как funcв объявлении параметра говорится, что f является именем указателя на нужную функцию, напомним сначала, что если f тогда это указатель *f это то, что f указывает на (т.е.функция print в данном случае).В результате просто замените каждое вхождение 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');

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

boost::function<int (char a)> functiontype2;

это намного приятнее, чем вышеописанное.

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

std::function<bool (int)>

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

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

// g++ test.cpp --std=c++11
#include <functional>

double Combiner(double a, double b, std::function<double (double,double)> 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<class T>
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 <stdio.h>

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 <stdio.h>

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();
}

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

Функции могут быть "переданы" как указатели на функции, согласно 6.7.6.3p8:"Объявление параметра как ‘тип возвращаемой функции’ должно быть скорректировано на ‘указатель на тип возвращаемой функции’, как в 6.3.2.1. ".Например, это:

void foo(int bar(int, int));

эквивалентно этому:

void foo(int (*bar)(int, int));

На самом деле это не функция, но это локализованный фрагмент кода.Конечно, он передает не код, а только результат.Он не будет работать, если будет передан диспетчеру событий для запуска позже (поскольку результат вычисляется сейчас, а не когда происходит событие).Но это локализует ваш код в одном месте, если это все, что вы пытаетесь сделать.

#include <stdio.h>

int IncMultInt(int a, int b)
{
    a++;
    return a * b;
}

int main(int argc, char *argv[])

{
    int a = 5;
    int b = 7;

    printf("%d * %d = %d\n", a, b, IncMultInt(a, b));

    b = 9;

    // Create some local code with it's own local variable
    printf("%d * %d = %d\n", a, b,  ( { int _a = a+1; _a * b; } ) );

    return 0;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top