programing

C에서 함수를 매개 변수로 전달하려면 어떻게 해야 합니까?

newsource 2022. 8. 18. 23:43

C에서 함수를 매개 변수로 전달하려면 어떻게 해야 합니까?

데이터 세트에 파라미터로 전달된 함수를 실행하는 함수를 만들고 싶습니다.C에서 함수를 매개 변수로 전달하려면 어떻게 해야 합니까?

선언.

기능 파라미터를 사용하는 기능의 프로토타입은 다음과 같습니다.

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

은 파라미터가 '''를 나타내고 .f를 가진 함수에 대한 포인터가 됩니다.void으로, 1개의 타입이 .int파라미터를 지정합니다. 함수하다print는 에 될 수 입니다.func적절한 타입이기 때문에 파라미터로 지정합니다.

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

함수 호출

함수 매개 변수를 사용하여 함수를 호출할 경우 전달된 값이 함수에 대한 포인터여야 합니다.여기에는 함수 이름(괄호 없음)을 사용합니다.

func(print);

func인쇄 기능을 전달합니다.

기능 본문

파라미터와 로 ada는func이제 함수 본문에 있는 매개 변수 이름을 사용하여 매개 변수 값에 액세스할 수 있습니다.라고 func는 0 ~ 4 의 번호로 전달되는 함수를 적용합니다.우선 인쇄를 직접 호출하는 루프가 어떻게 보이는지 생각해 보십시오.

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

★★func ' ' 、 음음 、 음 ' ' ' ' that 。f는, , 「이러다」의 경우는, 「이러다」라고 을 기억합니다.먼저 상기합니다.f는 입니다.*f바로 그 것이다fprint(어느 쪽인가)마다 「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」로 치환합니다.*f:

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

원천

이 질문에는 이미 함수 포인터를 정의하기 위한 정답이 있지만, 특히 어플리케이션에서 포인터를 전달할 경우 매우 혼란스러울 수 있습니다.이러한 불쾌감을 피하기 위해 기능 포인터를 보다 읽기 쉬운 것으로 입력하는 것이 좋습니다.예를들면.

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

ISO C11 6.7.6.3p8에 따라 함수는 함수 포인터로 "통과"될 수 있다: ""함수 복귀 유형"으로서의 매개변수의 선언은 6.3.2.1"과 같이 "함수 복귀 유형으로 포인트"로 조정되어야 한다. 예:

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

다음과 같습니다.

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

함수 포인터를 전달해야 합니다.구문은 조금 번거롭지만 익숙해지면 매우 강력합니다.

간단한 예시로 설명하겠습니다.compare다른 파라미터로서 기능하다sorting기능.커스텀 비교 함수를 사용하여 고정 if 문 대신 사용하는 버블 정렬 기능이 있다고 가정합니다.

비교 함수

bool compare(int a, int b) {
    return a > b;
}

이제 비교를 수행하기 위해 다른 함수를 파라미터로 사용하는 버블 정렬

버블 정렬 기능

void bubble_sort(int arr[], int n, bool (&cmp)(int a, int b)) {

    for (int i = 0;i < n - 1;i++) {
        for (int j = 0;j < (n - 1 - i);j++) {
            
            if (cmp(arr[j], arr[j + 1])) {
                swap(arr[j], arr[j + 1]);
            }
        }
    }
}

마지막으로,main부울 비교 함수를 인수로 전달하여 버블 정렬 함수를 호출합니다.

int main()
{
    int i, n = 10, key = 11;
    int arr[10] = { 20, 22, 18, 8, 12, 3, 6, 12, 11, 15 };

    bubble_sort(arr, n, compare);
    cout<<"Sorted Order"<<endl;
    for (int i = 0;i < n;i++) {
        cout << arr[i] << " ";
    }
}

출력:

Sorted Order
3 6 8 11 12 12 15 18 20 22
typedef int function();

function *g(function *f)
{
    f();
    return f;
}

int main(void)
{
    function f;

    function *fn = g(f);

    fn();
}

int f() { return 0; }

함수는 아니지만 현지화된 코드입니다.물론 결과만 코드를 통과시키는 것은 아닙니다.나중에 실행되도록 이벤트 디스패처에 전달하면 작동하지 않습니다(이벤트 발생 시 결과가 계산되지 않고 지금 계산됩니다).그러나 이것이 당신이 시도하려는 전부라면 당신의 코드를 한 곳에 현지화 할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/9410/how-do-you-pass-a-function-as-a-parameter-in-c