이번에 진행중인 프로젝트중 펌웨어 한가지로 두가지 보드 타입을 구동 하는 형태가 있습니다.

그래서 함수의 이름은 같지만 기능이 다른 형태로 사용 해야 하는 상황이 발생했는데요

이를 해결 하기위해  함수포인터를 사용 했습니다.


보드의 타입을 검사해 함수포인터에 각각 다른 함수의 주소를 넣어주는 식이지요.

간략히 예를 들어보겠습니다.


------ test.h -----------

#define MODE_A  0

#define MODE_B  1


typedef struct 

{

unsigned char board_mode;

void (*a)(void);

void (*b)(void);

} func;




--------test.c---------------
#include "printf.h"
#include "test.h"


func test_func;

void aa(void)
{
printf("aaaaaaa\r\n");
}

void bb(void)
{
printf("bbbbbbb\r\n");
}
void cc(void)
{
printf("ccccccc\r\n");
}

void dd(void)
{
printf("ddddddd\r\n");
}

void mode_set(unsigned char mode)
{
test_func.board_mode = mode;
}

void func_set(void)
{
if(test_func.board_mode == MODE_A)
{
test_func.a = aa;
test_func.b = bb;
}
else if(test_func.board_mode == MODE_B)
{
test_func.a = cc;
test_func.b = dd;
}
}

//-------------------------------------------------------------------------------------
// main 
//-------------------------------------------------------------------------------------
void main(void)
{
mode_set(MODE_A);
func_set();
test_func.a();
test_func.b();
mode_set(MODE_B);
func_set();
test_func.a();
test_func.b();
}
-------------------------------- 끝
test.c 파일에서는 각각의 모드에 따라 test_func.a 와 test_func.b 에 각각 다른 함수를 적용했습니다.

위 소스를 실행해 보면
aaaaaaa
bbbbbbb
ccccccc
ddddddd
이런 결과가 나옵니다.

모드에 따라 a, b 의 함수가 각각 aaaa ,bbbb  에서 cccc, dddd 함수로 변경 된 것입니다.