문제

데이터 세트에 대해 매개변수로 전달된 함수를 수행하는 함수를 만들고 싶습니다.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 이 경우).결과적으로 위 루프의 모든 인쇄 항목을 다음으로 바꾸십시오. *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를 반환하고 char을 취하는 함수의 경우

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