Tech & IT/프로그래밍

functor를 이용한 함수 매크로

해피콧 2009. 12. 9. 08:19
'); }
'); }
수업 내용
1. ADS(Code Warrior , AxD Debugger)
2. H-JTAG(open되어있는 무료 JTAG프로그램(USB는 유료))
3. ARM9 실습보드 세팅
4. ARM instruction 이해 

1. JTAG 설치 (H-JTAG, H-Flash(boot rom 굽는 프로그램)
2. boot rom fusing(Firmwre boot code 넣음)
3. AxD Debugger 연결
4. DNW(Hyper terminal) serial 

int a = 10; // RW
int b = 0 ; // ZI
int c ; // ZI
func()
{
  int d = 20;  //stack
  c ++ ;
 d = d + c;
 printf(___); // RO
}

ZI_LIMIT -----------------------------
                            ZI   : BSS(Block storage start 영역)
RW_LIMIT-----------------------------
                            RW   : DATA(RAM 영역)
RO_LIMIT-----------------------------
                            RO   : TEXT, CODE 영역(RAM/ROM)
RO_BASE-----------------------------





functor를 이용한 함수 매크로

call <--- 함수의 선두번지 + 매개 인자 리스트 

매크로도 return을 가지는 함수처럼 구현이 가능하다
괄호안에 , 로 구분되어있는 expr은 하나하나 실행 후에 마지막 expr값을 assign함 
(개발 편의를 위해 사용가능)

#define function(pfun, num, str) (printf("[%s]\n", str), pfun[num])

int Add(int x, int y) ;
int Sub(int x, int y) ;
int Mul(int x, int y) ;
int Div(int x, int y) ;

void main()
{
int a = 10, b = 20, c ;
int (*pfun[4])(int,int) = { Add, Sub, Mul, Div } ;
c = function(pfun, 2, "multiply")(a, b) ;
printf("[ %d  * %d  = %d ]\n", a, b, c) ;
}

int Add(int x, int y) { return (x+y) ; }
int Sub(int x, int y) { return (x-y) ; }
int Mul(int x, int y) { return (x*y) ; }
int Div(int x, int y) { return (x/y) ; }



#include <stdio.h>
#include <stdlib.h>


int add_int(int x, int y) { return (x+y) ; }
int sub_int(int x, int y) { return (x-y) ; }
int mul_int(int x, int y) { return (x*y) ; }
int div_int(int x, int y) { return (x/y) ; }

float add_float(float x, float y) { return (x+y) ; }
float sub_float(float x, float y) { return (x-y) ; }
float mul_float(float x, float y) { return (x*y) ; }
float div_float(float x, float y) { return (x/y) ; }

#define fun(name0, name1, x, y) name0##_##name1(x, y)

#define out(name0, name1, data) out_##name1(name0, name1, data)

#define out_int(name0, name1, data) \
printf(#name0"_"#name1" : [ %d ]\n", data)
#define out_float(name0, name1, data) \
printf(#name0"_"#name1" : [ %f ]\n", data)



void main()
{
int a = 100, b = 20, c ;
float fa = 50.2, fb = 20.4, fc = 0.0 ;

c = fun(add, int, a, b) ; out(add, int, c) ;
c = fun(div, int, a, b) ; out(div, int, c) ;
c = fun(mul, int, a, b) ; out(mul, int, c) ;

fc = fun(add, float, fa, fb) ; out(add, float, fc) ;
fc = fun(div, float, fa, fb) ; out(div, float, fc) ;
fc = fun(mul, float, fa, fb) ; out(mul, float, fc) ;
}

=====================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#if 0
struct sData 
{
char *pstr, str[24] ;
int b ;
} ;

int add(int x, int y) { return (x+y) ; } ;
int sub(int x, int y) { return (x-y) ; } ;

void main()
{
sData m = {"GL-209" };

*(((int (**)(int, int))m.str)+0) = add ;
*(*(((int (*(*)[2])(int, int))m.str)+0)+1) = sub ;

*(((int *)m.str)+2) = 100 ;
*(((int *)m.str)+3) = 20 ;

m.b = (*(*(((int (*(*)[2])(int, int))m.str)+0)+0))
(*(((int *)(m.str))+2), *(((int *)(m.str))+3)) ;
printf("[ %d ]\n", m.b) ;

m.b = (*(((int (**)(int, int))(m.str))+1))
(*(((int *)(m.str))+2), *(((int *)(m.str))+3)) ;
printf("[ %d ]\n", m.b) ;

for(int u=0 ; u< 7 ; *(m.str+16+u) = *(m.pstr+u++));
printf("[ %s ]\n", m.str+16) ;
strcpy(m.str, "Arminia-209 Ellias-404") ;
printf("[ %s ]\n", m.str) ;
}
#endif

struct sData 
{
char *pstr;
union {
int (*fun[2])(int, int);
int a[4] ;
char str[24];
};
int b;
} ;

int add(int x, int y) { return (x+y) ; } ;
int sub(int x, int y) { return (x-y) ; } ;

void main()
{
sData m = {"GL-209" };
m.fun[0] = add ;
m.fun[1] = sub ;
m.a[2] = 100 ;
m.a[3] = 20 ;

m.b = m.fun[0](m.a[2], m.a[3]) ;
printf("[ %d ]\n", m.b) ;

m.b = m.fun[1](m.a[2], m.a[3]) ;
printf("[ %d ]\n", m.b) ;

for(int u=0 ; u< 7 ; u++)
m.str[16+u] = m.pstr[u] ;
printf("[ %s ]\n", &m.str[16]) ;


strcpy(m.str, "Arminia-209 Ellias-404") ;
printf("[ %s ]\n", m.str) ;

}