C语言中有规律的代码的生成方法
本帖最后由 iorixwj 于 2013-9-5 16:00 编辑前些天,我发现一个小子努力的在敲PIC16LF1907的LCD驱动代码,其中一段如下:
union {
uchar data;
struct {
unsigned SEG0COM0 : 1;
unsigned SEG0COM1 : 1;
unsigned SEG0COM2 : 1;
unsigned SEG0COM3 : 1;
} bits;
} LCDDATA0 @ 0x140;
union {
uchar data;
struct {
unsigned SEG1COM0 : 1;
unsigned SEG1COM1 : 1;
unsigned SEG1COM2 : 1;
unsigned SEG1COM3 : 1;
} bits;
} LCDDATA0 @ 0x141;
…………(此处省略N行)
union {
uchar data;
struct {
unsigned SEG23COM0 : 1;
unsigned SEG23COM1 : 1;
unsigned SEG23COM2 : 1;
unsigned SEG23COM3 : 1;
} bits;
} LCDDATA23 @ 0x157;
看见了这代码,我跟他说,这样有规律的代码可以要用代码去生成,能节省时间也避免一些错误。
这是怎么一回事?我让他先把python环境安装了。
python环境搭建:
这步简单,网上也有好多教材,只要在python官网http://www.python.org/getit/ 找到相应平台下的python安装就可以了
完了设一下环境变量就可以,如图1
然后随便写段代码,运行成功…… 如图2
用phthon生成C语言文件:
直接上代码:
tmpl = '''volatile union {
uchar data;
struct {
unsigned SEG%(idx)dCOM0 : 1;
unsigned SEG%(idx)dCOM1 : 1;
unsigned SEG%(idx)dCOM2 : 1;
unsigned SEG%(idx)dCOM3 : 1;
} bits;
} LCDDATA%(idx)d @ 0x%(addr)x;
'''
with open("lcd_def.h", "w") as outfile:
for i in range(24):
idx = i
addr = 0x140+i
outfile.write( tmpl %{ 'idx': idx, 'addr': addr } )
保存后运行一下,文章最前面的代码就自动生成了!
如图3 ctrl+C ,ctrl+V leifeng 发表于 2013-9-5 15:59 static/image/common/back.gif
ctrl+C ,ctrl+V
不是重复代码啦{:2_39:} 宏定义
凑字数 zhugean 发表于 2013-9-5 16:09 static/image/common/back.gif
宏定义
凑字数
怎么弄?欢迎拍砖 本帖最后由 zhugean 于 2013-9-5 16:40 编辑
#define TEST(a,b,c) \
union { \
uchar data; \
struct { \
unsigned SEG##c##COM0 : 1;\
unsigned SEG##c##COM1 : 1;\
unsigned SEG##c##COM2 : 1;\
unsigned SEG##c##COM3 : 1;\
} bits;\
} LCDDATA##a @ 0x##b ;
复制粘贴 列编辑 会用##进行宏定义就可以了 最简单的代码生成器实际上是excel
拖出一列数字,然后写字符串加法,往下拖,就行了。。。 顶宏定义
这种东西用python,太牛刀杀鸡了,不确切的说应该是大炮打蚊子了。 傻孩子的教程里面有这个方法
给你个例子
//here is a magic method combine two strings at the preprocess period
//a recursion in fact
#define TPASTE2( a, b) a##b
#define MREPEAT(count, macro, data) TPASTE2(MREPEAT, count)(macro, data)
#define MREPEAT0(macro, data)
#define MREPEAT1(macro, data) MREPEAT0(macro, data) macro(0, data)
#define MREPEAT2(macro, data) MREPEAT1(macro, data) macro(1, data)
#define MREPEAT3(macro, data) MREPEAT2(macro, data) macro(2, data)
#define MREPEAT4(macro, data) MREPEAT3(macro, data) macro(3, data)
#define MREPEAT5(macro, data) MREPEAT4(macro, data) macro(4, data)
#define MREPEAT6(macro, data) MREPEAT5(macro, data) macro(5, data)
#define MREPEAT7(macro, data) MREPEAT6(macro, data) macro(6, data)
#define MREPEAT8(macro, data) MREPEAT7(macro, data) macro(7, data)
#define MREPEAT9(macro, data) MREPEAT8(macro, data) macro(8, data)
#define MREPEAT10( macro, data) MREPEAT9(macro, data) macro(9, data)
#define MREPEAT11( macro, data) MREPEAT10( macro, data) macro( 10, data)
#define BUFFER_RX_DEFINATION(CH_NUM, unused)RingBufInit(&g_sRxBuf[##CH_NUM##], g_pucRX##CH_NUM##Buffer, BUFFER_SIZE_CH##CH_NUM##);
MREPEAT(MAX_S2E_PORTS, BUFFER_RX_DEFINATION, ~)
#undef BUFFER_RX_DEFINATION
上面三句话得到的结果是
RingBufinit(&g_sRxBuf,g_pucRX0Buffer,BFFER_SIZE_CH0);
RingBufinit(&g_sRxBuf,g_pucRX1Buffer,BFFER_SIZE_CH1);
RingBufinit(&g_sRxBuf,g_pucRX2Buffer,BFFER_SIZE_CH2);
RingBufinit(&g_sRxBuf,g_pucRX3Buffer,BFFER_SIZE_CH3);
....... 我一般也是用## get a copy of IAR-AVR and see how they did it.
八仙过海,各显神通.哈哈. 没用过,一般都是ctrl+c,ctrl+v,没想这么复杂。 mark ##,见过别人用过自己没用过 学习了,谢谢 八仙过海 各显神通 {:lol:}{:lol:}{:lol:} 不错,需要好好学习…… 想用C++来做呀,不过不知怎么下手...。
页:
[1]