2009-11-08 6 views

답변

7

아니요, '함수'를 매개 변수로 전달할 수 없습니다. 그러나 대신 함수에 대한 포인터를 전달할 수 있습니다.

함수 호출에 대한 괄호없이 이름으로 함수를 참조 할 때 함수에 대한 포인터를 참조하고 있습니다. ') (SQRT'여기서

#include <math.h> 
#include <stdio.h> 

static void generator(double lo, double hi, double inc, double (*function)(double)) 
{ 
    double x; 
    for (x = lo; x < hi; x += inc) 
     printf("x = %6g; f(x) = %6g\n", x, (*function)(x)) 
} 

int main(void) 
{ 
    generator(0.0, 1.0, 0.02, sin); 
    generator(0.0, 1.0, 0.02, cos); 
    generator(0.0, 1.0, 0.02, sqrt); 
    return(0); 
} 

, 기능 '죄()', 'COS() 및 : 따라서, 예를 들어, 우리는 수학적 함수 값 테이블을 생성하는 기능을 고려할 수있다 모두 동일한 프로토 타입 스키마를가집니다 : double 인수를 취하여 double 값을 반환하는 함수.

generator(0.0, 1.0, 0.02, sin()); 

내가 컴파일 오류의 무리를 얻을 것이다 - 때문에 하나의 '죄()'인수를 기대하고, 또 다른 이유로 '발전기()'함수에 대한 포인터를 기대하지를 : 내가 잘못 쓴 경우합니다 마지막 인수로서의 double 값 의

(또한 좋은 프로그램은 적어도 그것을 계산하는 기능을 식별 할 것이며, 이중 숫자의 반복 단위의 정확성에 대한 좋은 생각이 아니다 있습니다. 그것은하지만, 예.)

9

포인터를 사용하여 기능을 수행하십시오. 마찬가지로
int (*ptr2_fun)() 받기 기능의 존재 :
여기 int execute_your_function(int (*fun)())

당신은 여기에 몇 가지 examples

+0

좋은 예가 될 것입니다! –

+2

qsort()를 확인하십시오. 비교 기능을 허용합니다. – Alexandru

3

을 물론 함수 포인터를 사용할 수 있습니다.

#include <stdio.h> 
typedef void (*bar_callback)(void); 

void foo(void) 
{ 
    puts("foo"); 
} 

void bar(bar_callback callback) 
{ 
    puts("bar"); 
    callback(); 
} 
int main(int argc,char **argv) 
{ 
    bar(foo); 
    return 0; 
} 
3

. 함수가 아닌 그 자체는이지만 함수를 가리키는 포인터입니다.

qsort()을 참조하십시오.

int cmp(const void *a, const void *b) { /* ... */ } 
/* ... */ 
qsort(data, nelems, sizeof *data, cmp); /* pass the function `cmp` to qsort() */ 
관련 문제