본문 바로가기
개발 업무(코딩)-개발자였을때 썼던..

c언어 함수포인터(fp) function pointer 간단 예제

by 주용사 2023. 1. 8.
728x90

생소한 문법으로 적혀있는 코드를 보고 무엇인지 따라 추적하다가 void (*함수포인터)()라는 것을 알았다.

간단한 테스팅 소스코드를 작성해보았고 밑에 예시는 '실전'이다.

#include <stdio.h>

int add(int a, int b)
{
        return a+b;
}
int mul(int a, int b)
{
        return a*b;
}
int main()
{
        int (*fp)(int, int);
        fp = add;
        printf("%d\n", fp(10,20)); // 30 출력
        fp = mul;
        printf("%d\n", fp(10,20)); // 120 출력
}

 

a.out

 
#define MAX_TR 100

typedef int (*TrFunc)(char *, char *); // 함수포인터(fp)의 별칭 설정
typedef struct
{
        int iTrCode;
        TrFunc pTrFunc; // 함수포인터 별칭을 구조체 멤버 자료형으로 사용
} TR_FUNC_ST;

int Tr1004 (char *, char *); // 각 tr의 기능 구현
int Tr1005 (char *, char *);

TR_FUNC_ST  gtQATrFunc[MAX_TR] =
{ // 개발 완료한 tr 등록
        {1005, Tr1005},
        {1004, Tr1004},

        {-1, NULL}
};
TrFunc Get_Tr_Func (TR_FUNC_ST *pptTrFunc, int piMaxTrFunc, int piTrCode);

int main()
{
        int ret;
        TrFunc pTrFunc; // 함수 포인터 별칭으로 변수 선언

        char *InBuf;
        char *OuBuf;
        if ((pTrFunc = Get_Tr_Func (gtQATrFunc, MAX_TR, 1005)) == NULL) // 함수포인터에 담았고
        {
        }
        ret = pTrFunc (InBuf, OuBuf); // 실행

        printf("ret = %d\n", ret);
}

TrFunc Get_Tr_Func (TR_FUNC_ST *pptTrFunc, int piMaxTrFunc, int piTrCode)
{
        int     i;
        int     iFind = 0;

        for (i = 0; i < piMaxTrFunc; i++, pptTrFunc++)
        {
                if (piTrCode == pptTrFunc->iTrCode)
                {
                        iFind = 1;
                        break;
                }

                // Last
                if (-1 == pptTrFunc->iTrCode)
                        break;
        }
        if (iFind == 1)
                return pptTrFunc->pTrFunc;

        return NULL;
}

int Tr1005 (char *in, char *out)
{
        printf("Tr1005 test\n");
}
int Tr1004 (char *in, char *out)
{
        printf("Tr1004 test\n");
}
728x90