C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[2631] 답변감사합니다... 그리고 보충질문입니다...
문보석 [] 4071 읽음    2000-01-06 00:00
질문 드렸던게 이런 내용입니다...

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;

              :
              : 중략
}
그리고 위에서 처럼 (*함수이름)(인자) 형태로 호출합니다...
임프님이 말씀하신 *(함수이름)(인자) 형태와 기능상으로는 같다고 봅니다...
아!! 똑같은거 아닌가요?? 괄호의 우선순위보다 '*'의 우선순위가 앞서기 때문에
인자가 들어가는 괄호'(' 보다 먼저 '*'가 인식이 먼저 되겠죠...
그래서 결국 함수 이름은 그 함수가 실행될 코드가 있는 포인터를 가르키니까
보통 쓰는 함수 호출방법과 함수이름 앞에 '*'를 붙여서 호출하나 기능은 똑같게 되겠죠???
맞나???(^^;)
근데 저렇게 쓰면 어떤 이점이 있는거죠??
모르겠당~~~~
그럼 안녕히...



+ -

관련 글 리스트
2623 함수 호출하는 부분에서.... 문보석 3872 2000/01/05
2629     Re:게시판 프로그래밍 (CGI/ISAPI) 박지훈.임프 4447 2000/01/06
2626     Re:함수 호출하는 부분에서.... 박지훈.임프 3997 2000/01/06
2631         답변감사합니다... 그리고 보충질문입니다... 문보석 4071 2000/01/06
2633             Re:함수의 포인터 박지훈.임프 4297 2000/01/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.