function pointer 본문

Programming/C

function pointer

halatha 2008. 7. 2. 15:32

gcc 3.4.5 (mingw), Windows XP

/*

    마소 주니어    2004.02

    page    28

    명령행 인자를 주어 menu를 선택하는 경우

*/

#include <stdio.h>

#include <string.h>

void doHello()

{

    printf("command was HELLO\n");

}

void doJiny()

{

    printf("command was JINY\n");

}

void doNone()

{

    printf("command was NONE\n");

}

void doCmd(const char* p_cpCmd)

{

    if ( strcmp(p_cpCmd, "hello") == 0 )

    {

        doHello();

    }

    else if ( strcmp(p_cpCmd, "jiny") == 0 )

    {

        doJiny();

    }

    else

    {

        doNone();

    }

}

struct

{

    const char*    m_cpCmd;

    void (*m_vpCmdHandler)(void);

}    CmdTbl_t[] =

    {

        { "hello", doHello },

        { "jiny", doJiny },

        { NULL, doNone },

    };

void doCmdUsingFunctionPointer(const char* p_cpCmd)

{

    int    z_iLoop = 0;

    for ( z_iLoop = 0; CmdTbl_t[z_iLoop].m_cpCmd != NULL; ++z_iLoop )

    {

        if ( strcmp(CmdTbl_t[z_iLoop].m_cpCmd, p_cpCmd) == 0 )

        {

            (*CmdTbl_t[z_iLoop].m_vpCmdHandler)();

            return;

        }

    }

    (*CmdTbl_t[z_iLoop].m_vpCmdHandler)();

    return;

}

int main(int argc, char* argv[])

{

    if ( argc < 2 )

        return -1;

    printf("Using if-else...\n");

    doCmd(argv[1]);

    printf("Using function pointer table...\n");

    doCmdUsingFunctionPointer(argv[1]);

    return 0;

}

실행 예: hello와 jiny를 인자로 준 경우에는 해당 function을, 그렇지 않은 경우에는 none에 해당하는 function 호출

/*

    C 포인터 이렇게 활용한다

    page    211

    숫자를 입력해 menu를 선택하는 경우

*/

#include <stdio.h>

typedef void (*mfunc)(void);    //    인자와 return값이 void인 함수의 포인터, mfunc형을 작성한다

void menue1(void)

{

    printf("Menu 1 is selected\n");

}

void menue2(void)

{

    printf("Menu 2 is selected\n");

}

void menue3(void)

{

    printf("Menu 3 is selected\n");

}

void menue4(void)

{

    printf("Menu 4 is selected\n");

}

void display(void)

{

    printf("1 ... Menu - 1\n");

    printf("2 ... Menu - 2\n");

    printf("3 ... Menu - 3\n");

    printf("4 ... Menu - 4\n");

    printf("0 ... End\n");

    printf("Input Number > ");

}

mfunc g_fArrMenu[] = { menue1, menue2, menue3, menue4 };    //    mfunc형의 array

int main()

{

    int    z_iSelected;    //    선택된 번호

    int    z_iNumberOfMenu = sizeof(g_fArrMenu) / sizeof(mfunc);    //    menu 개수

    printf("sizeof(g_fArrMenu) = %d\n", z_iNumberOfMenu);

    do

    {

        display();    //    menu 선택 화면 출력

        scanf("%d", &z_iSelected);

        if ( z_iSelected >= 1 && z_iSelected <= z_iNumberOfMenu )

        {

            g_fArrMenu[z_iSelected - 1]();

        }

    }    while ( z_iSelected );

    return 0;

}

실행 예

Comments