[c/c++]함수포인터(Function Pointer)

프로그래밍/C/C++/etc 2009. 5. 25. 23:02 posted by 야매코더
요즘 게임서버를 스터디 하고 있는데 프로토콜을 맞추고 실행을 해보니.
이게 좀 이상하게 작동을 한다..소위 "순간이동" 을 한다..ㅠ

원인이 뭔지는 아직 잘 모르겠다.
서버로 돌리는 컴의 사양이 팬티엄3 라서 너무 느린건가 하는 의심도 가고 ..
뭐 대단한 기능이 있는 프로그램도 아니고 받은 데이타를 바로 다른 유저에게 쏴주는게 거의 대부분이라
뭐가 문제일까 고민을 했다. 

이유가 뭘까? 옆에 개발자들의 조언을 들어보니 소스에 switch 문을 좀 많이 쓴거 아닌가 라는 의견이 있었다.
받는 데이타에 대한 분류를 switch문으로 했는데 그게 속도를 좀 잡아먹을수 있다는 말이었다.
그럼 어쩌란 말인가...프로토타입패턴이 나오고 해서 머리가 좀 아프다.
c++로 하면 편하겠지만 쪼매라도 빠르게 하고자...C로 작업하는데 뭔 클래스의 복사가 나오나..

"그냥 함수포인터 써...배열에 함수명 쭉 넣고...받는 인자값의 위치에 함수명 넣어..."
이렇게 이야기 해주면 참 편하잔아....

그래서 다시 보고자 한다..

함수포인터(Function Pointer)

자. 말그대로 함수를 가리키는 포인터다. 함수가 불러지는 메모리의 시작위치다.
설명은 어렵다..코드로 보자.

#include <stdio.h>

int test(int i){
return i*i;
}


int main(){
int sum=0;
int (*fp)(int i);
fp=test;

sum = (*fp)(10);
printf("sum = %d",sum);
return 0;
}
초간단 소스다.

int test(int i);
함수를 선언한다.

아래와 같이
int (*fp)(int i);
이렇게 함수포인터를 참조할 함수와 동일한 형태로 만든다.

fp=test;

할당 한다. 여기서 주의점은 함수명뒤에 아무것도 없다.


이걸 활용해 보자..



*******************************************************************************************************************
내용추가..

배열에 대입해서도 쓴다..

1. 타입을 선언하고..
2. 배열에 함수명을 넣고.
3. 배열값을 반환받아서 쓴다.


void On0xA0(char* szText, int len) {
 printf("Function test 11111\n");
}

void On0xA1(char* szText, int len) {
 printf("Function test 22222\n");
}

typedef void (* Func_point )(char* szText, int len);
Func_point com_list[2] = { On0xA0, On0xA1};

void (*cmd_pt)( char* szText, int len);

void main() {
 int i = 0;
 for (i = 0; i < 2; i++) {
  cmd_pt = com_list[buf_in[1] - 48];
  cmd_pt(cp, buf_in, 0);
 }
}

 참 쉽죠잉~~~

To be continued.    -夜昧-