|
질문 드렸던게 이런 내용입니다...
typedef struct
{
int current_state;
int event;
int next_state;
void (*funcptr)(int);
}TABLE;
이런 구조체에서 함수 프로토타입 처럼 선언되어있죠...
실제 프로토타입은 아래와 같습니다... 많아서 중략했습니다...
/* Function Prototypes */
void sysinit(void);
void play(int);
void get_digits(int);
void sethook(int);
void wait_event();
void check_event(int,int);
void wtring(int);
int process_event(int);
int getxcord(int);
int getycord(int);
int getindex(HWND);
int getindexvoice(HWND);
:
:
그리고 테이블구조체의 변수를 배열로 잡아 다음과 같이 초기화합니다...
TABLE table[]=
{ /* current_state event next_stat function */
{ ST_WTRING, DE_RINGS, ST_OFFHOOK, setoffhk },
{ ST_OFFHOOK, DX_OFFHOOK, ST_PLAY, play },
{ ST_OFFHOOK, DE_LCOFF, ST_ONHOOK, sethook },
{ ST_PLAY, TM_EOD, ST_GETDIG, get_digits },
{ ST_PLAY, TM_MAXDTMF, ST_GETDIG, get_digits },
{ ST_PLAY, TM_LCOFF, ST_ONHOOK, sethook },
{ ST_GETDIG, TM_MAXDTMF, ST_CONFER, conference },
{ ST_GETDIG, TM_MAXTIME, ST_RING, ring },
{ ST_INVALID, TM_EOD, ST_GETDIG, get_digits },
{ ST_INVALID, TM_MAXDTMF, ST_GETDIG, get_digits },
{ ST_INVALID, TM_LCOFF, ST_ONHOOK, sethook },
{ ST_ROUTE, MSMM_ONHOOK, ST_ONHOOK, unroute },
{ ST_ROUTE, MSMM_HOOKFLASH,ST_INCONF, unroute },
{ ST_PLAYBUSY, TM_EOD, ST_ONHOOK, unroute },
{ ST_PLAYBUSY, TM_MAXDTMF, ST_ONHOOK, unroute },
{ ST_MSIROUTE, TDX_PLAYTONE, ST_INTXFRDIG, get_digits },
{ ST_MSIROUTE, MSMM_ONHOOK, ST_STOPCH, stopch },
{ ST_MSINVALID, TM_MAXDTMF, ST_INTXFRDIG, get_digits },
{ ST_MSINVALID, TM_EOD, ST_INTXFRDIG, get_digits },
{ ST_INTXFRDIG, MSMM_ONHOOK, ST_ONHOOK, stopch },
{ ST_CHKDIG, MSMM_ONHOOK, ST_ONHOOK, stopch },
{ ST_INTXFRDIG, TM_MAXTIME, ST_ONHOOK, unroute },
{ ST_MSINVALID, MSMM_ONHOOK, ST_ONHOOK, stopch },
{ ST_ONHOOK, TM_USRSTOP, ST_ONHOOK, unroute },
{ ST_INCONF, TDX_PLAYTONE, ST_INCONF, msunroute },
{ ST_PLAYBUSY, MSMM_ONHOOK, ST_ONHOOK, stopch },
{ ST_ONHOOK, DX_ONHOOK, ST_WTRING, wtring }
:
:
:
};
위에서처럼 마지막 인자에는 함수 이름만 적어넣었죠...
LRESULT WINAPI ChildProcMsi(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
int i;
switch(uMsg){
case WM_CREATE:
break;
case WM_COMMAND:
switch(LOWORD(wParam) ){
case ADD_CONF: // have party added to conference
i = getindex(hwnd);
selection = MSPN_TS;
dxinfo[msinfo[i].channel].state = ST_INCONF;
(*unroute)(msinfo[i].channel);
EnableWindow(hButtonAdd[i], FALSE);
break;
case ENTER_CONF:
i = getindex(hwnd);
dxinfo[msinfo[i].channel].state = ST_INCONF;
selection = MSPN_STATION;
(*stopch)(msinfo[i].channel);
EnableWindow(hButtonEnter[i], FALSE);
break;
}
break;
:
: 중략
}
그리고 위에서 처럼 (*함수이름)(인자) 형태로 호출합니다...
임프님이 말씀하신 *(함수이름)(인자) 형태와 기능상으로는 같다고 봅니다...
아!! 똑같은거 아닌가요?? 괄호의 우선순위보다 '*'의 우선순위가 앞서기 때문에
인자가 들어가는 괄호'(' 보다 먼저 '*'가 인식이 먼저 되겠죠...
그래서 결국 함수 이름은 그 함수가 실행될 코드가 있는 포인터를 가르키니까
보통 쓰는 함수 호출방법과 함수이름 앞에 '*'를 붙여서 호출하나 기능은 똑같게 되겠죠???
맞나???(^^;)
근데 저렇게 쓰면 어떤 이점이 있는거죠??
모르겠당~~~~
그럼 안녕히...
|