2011-11-09 2 views
0

내가 포인터의 배열에 대한func 포인터를 호출하는 포인터 배열을 만드는 방법은 무엇입니까?

#include <stdio.h> 

int sum(int a, int b); 
int subtract(int a, int b); 
int mul(int a, int b); 
int div(int a, int b); 

int (*p[4]) (int x, int y); 

int main(void) 
{ 
    int result; 
    int i, j, op; 

    p[0] = sum; /* address of sum() */ 
    p[1] = subtract; /* address of subtract() */ 
    p[2] = mul; /* address of mul() */ 
    p[3] = div; /* address of div() */ 

    printf("Enter two numbers: "); 
    scanf("%d %d", &i, &j); 

    printf("0: Add, 1: Subtract, 2: Multiply, 3: Divide\n"); 
    do { 
    printf("Enter number of operation: "); 
    scanf("%d", &op); 
    } while(op<0 || op>3); 

    result = (*p[op]) (i, j); 
    printf("%d", result); 

    return 0; 
} 

int sum(int a, int b) 
{ 
    return a + b; 
} 

int subtract(int a, int b) 
{ 
    return a - b; 
} 

int mul(int a, int b) 
{ 
    return a * b; 
} 

int div(int a, int b) 
{ 
    if(b) 
     return a/b; 
    else 
     return 0; 
} 

코드 기능에 FUNC 포인터의 배열에 코드를 가지고 :

#include <stdio.h> 

int sum(int, int); 
int product(int, int); 
int subtract(int, int); 

int main() 
{ 
    int i = 0; 
    int a = 10; 
    int b = 5; 
    int result = 0; 
    int (*pfun[3])(int, int); 

    pfun[0] = sum; 
    pfun[1] = product; 
    pfun[2] = subtract; 

    for(i = 0 ; i < 3 ; i++) 
    { 
    result = pfun[i](a, b); 
    printf("\nresult = %d", result); 
    } 

    result = pfun[1](pfun[0](a, b), pfun[2](a, b)); 
    printf("\n\nThe product of the sum and the subtract = %d\n",result); 
} 

int sum(int x, int y) 
{ 
    return x + y; 
} 

int product(int x, int y) 
{ 
    return x * y; 
} 

int subtract(int x, int y) 
{ 
    return x - y; 
} 

지금이 두 프로그램을 결합하는 방법. func 포인터와 func 포인터를 가리키는 포인터 배열은 다른 수의 arg를 가질 수 있습니다. 어떠한 제안.

+1

C 또는 C++? 하나를 선택. –

+0

C가 충분합니까? – thuk

+0

당신이 말해줘! 어떤 언어를 쓰고 있습니까? –

답변

4

가변 개수의 인수 (매우 어렵지는 않지만 union을 사용할 수 있음)가있는 함수 포인터를 저장할 필요가있을뿐만 아니라 올바른 인수를 사용하여 함수를 호출해야합니다. 그것은 당신의 디자인을 고려할 때 좀 더 까다 롭습니다.

대신 stack을 사용하는 것이 좋습니다. 귀하의 모든 함수는 인수로 스택을 걸릴 것 :

void sum(stack_t *stack); 
void subtract(stack_t *stack); 
void product(stack_t *stack); 

그리고 당신의 배열은 이런 식으로 선언 될 수있다 :

typedef void callback_t(stack_t *); 

callback_t *p[] = 
{ 
    sum, 
    subtract, 
    product, 
    /* ... */ 
}; 

그리고 예를 들어 sum 등으로 구현 될 것이다 :

void sum(stack_t *stack) 
{ 
    if (depth(stack) < 2) 
     perror("Not enough arguments in stack!"); 
    int b = popstack(stack); 
    int a = popstack(stack); 
    int c = a + b; 
    pushstack(stack, c); 
} 

단항 빼기는 다음과 같이 구현됩니다.

각 함수는 필요한 인수 수를 결정합니다. 발신자는 알 필요가 없습니다.

+0

답장 보내 주셔서 감사합니다. – thuk

+0

func 포인터를 가리키는 포인터 테이블을 만드는 방법은 무엇입니까? – thuk

+0

@thuk : 나는 그 질문을 이해하고 있는지 확신 할 수 없지만, 내가 필요한 정보가 있다고 생각한다. 그것이 당신이 원하는 것인지 말해줘. –

관련 문제