Papers/programming

function pointer

tomato13 2006. 10. 10. 12:52

#include
#include

 

typedef struct{
 unsigned char u08Port;
 void (*pFunc)(void);
}ADC_CONTROL_BUF;

 

void testFunc(void){
 printf("bing go\n");
}

 

void main(){
 ADC_CONTROL_BUF* pBuf;
 void (*pFuncLocal)(void);

 pBuf = (ADC_CONTROL_BUF*)malloc(sizeof(char) + sizeof(int));

 pBuf->u08Port = NULL;
 pBuf->pFunc = &(testFunc);
 pFuncLocal = pBuf->pFunc;

 pFuncLocal();
}

 

void(*pFuncLocal)(void)와 같이 함수의 prototype을 정의해 주고 func. pointer로 넘겨받아 사용할 수 있는 듯 하다.

 

 

조금 더 살펴보았다.(07년 4월 11일)

#include

class PCTask{
public:
 PCTask() {};
 ~PCTask() {};
};

 

void (*BALCallback)(PCTask* pPCTask, int num){                      (1)
    printf("BALCallback\n");
}

 

int RegisterConnTerminated(void(* Callback)(PCTask*, int)){
 void (* pFunc)(PCTask*, int);
 pFunc = Callback;

 PCTask* pTask = new PCTask();

 pFunc(pTask, 0);

 delete pTask;

 return 1;
}

 

int main(void){
 RegisterConnTerminated(BALCallback); 

 return 1;
}

 

위의 프로그램은 error를 발생시킨다. (1)에서 오류가 있는 듯 하다.


#include

class PCTask{
public:
 PCTask() {};
 ~PCTask() {};
};

 

void BALCallback(PCTask* pPCTask, int num)
{
    printf("BALCallback\n");
}

 

int RegisterConnTerminated(void Callback(PCTask*, int)){
 void (* pFunc)(PCTask*, int);                         (2)
 pFunc = &(Callback);

 PCTask* pTask = new PCTask();

 pFunc(pTask, 0);

 delete pTask;

 return 1;
}

 

int main(void){
 RegisterConnTerminated(&BALCallback); 

 return 1;
}

 

위의 프로그램은 정상 동작된다. (2)에서 void* pFunc하는 것과 void (*pFunc)는 다른다.

 

6/28

매번 부닥칠때마다 어렵게 느껴진다. 오늘 다시 정래해 본다.

 

자, 아래 문장을 읽어보고...

C/C++ 에서 복잡한 typedef 중 가장 현실적이고 많이 사용하는것은 일반적인 형태의 함수 포인터입니다.

가령 typedef char (*A) (void );  와 같은것이죠. 

 

아래 사이트도 참고를 해 본다.

http://cafe.naver.com/lifree0.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=23

http://cafe.naver.com/devctrl.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=3903

 

아래는 시험적으로 작성해본 프로그램이다. 첫번째 프로그램이다.

#include


typedef void (callback)(int arg1);

void func1(int arg1)
{
 printf("arg1 = %d\n", arg1);
}

 

int set_callback(callback arg1)

 arg1(1);

 return 1;
}

 

int main()
{
 set_callback(func1);

 return 1;
}

두번째 프로그램이다.

 

#include


typedef char (callback)(int arg1);

char func1(int arg1)
{
 printf("arg1 = %d\n", arg1);

 return (char)'a';
}

int set_callback(callback arg1)
{
 
 arg1(1);

 return 1;
}

int main()
{
 set_callback(func1);

 return 1;
}

 

세번째 프로그램이다.

 

#include


typedef char (*callback)(int arg1);

char func1(int arg1)
{
 printf("arg1 = %d\n", arg1);

 return (char)'a';
}

int set_callback(callback arg1)
{
 
 arg1(1);

 return 1;
}

int main()
{
 set_callback(func1);

 return 1;
}

 

아직 정확한 개념을 정립하지는 못하였으나 어렴풋이 이해를 하고 사용을 할 수는 있을 듯 하다.

'Papers > programming' 카테고리의 다른 글

struct pointer  (0) 2007.06.12
enum  (0) 2007.05.16
typedef, callback  (0) 2007.03.17
정수형 포인터 초기화  (0) 2007.02.28
소멸자를 가상함수로 쓰는 이유  (0) 2007.02.12