c - функций - указатель на функцию в структуре си




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

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


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


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

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

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

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;

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


декларация

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

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







parameters