일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Malaysia
- Python
- history
- erlang
- comic agile
- hbase
- France
- Italy
- UK
- QT
- Software Engineering
- management
- django
- Kuala Lumpur
- web
- Programming
- programming_book
- program
- MySQL
- RFID
- psychology
- Book review
- Spain
- Linux
- Java
- ubuntu
- agile
- hadoop
- Book
- leadership
- Today
- Total
function pointer 본문
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;
}
실행 예