打印

一线研发之声 之 C程序的软件分层,看您躺枪没?

[复制链接]
楼主: sedatefire
手机看帖
扫描二维码
随时随地手机跟帖
81
gozzz| | 2013-10-25 12:21 | 只看该作者 回帖奖励 |倒序浏览
我了个去,第一枪就把我打中了。
做记号,改天认真研读

使用特权

评论回复
82
香水城主| | 2013-10-25 12:39 | 只看该作者
俺是来当枪靶的,“草船借箭”,等着LZ的机关枪,

使用特权

评论回复
83
陈安业| | 2013-10-31 15:38 | 只看该作者
虽然不知道你在说些什么,但是赞一个

使用特权

评论回复
84
lhchen922| | 2013-11-1 09:06 | 只看该作者
非计算机专业,学习了。

使用特权

评论回复
85
cthan| | 2013-11-1 11:53 | 只看该作者
哎,在一家IC厂做了一年多了  都是用汇编写程式,决定给自己留条出路  学习C中

使用特权

评论回复
86
bingmcu| | 2013-11-1 12:48 | 只看该作者
未枪,等待楼主开第三枪

使用特权

评论回复
87
菜鸟同学| | 2013-11-1 14:02 | 只看该作者
学习,我以前就不注重这样写,还很鄙视这样写,觉得写的没有效率,最后自己做了才晓得,我*前面没弄好,后面维护起来,累死!BUG满天飞!

使用特权

评论回复
88
j_zh| | 2013-11-1 16:03 | 只看该作者
转做单片机半年了吧,虽然是汇编,但依然躺枪...

使用特权

评论回复
89
zjxcml| | 2013-11-5 11:24 | 只看该作者
呵呵,学习啦

使用特权

评论回复
90
KC_CEC| | 2013-11-9 22:38 | 只看该作者
不错,还是挺有收获的。函数指针用的不是很熟,希望楼主讲解一下。

使用特权

评论回复
91
呆板书生| | 2013-11-10 07:48 | 只看该作者
第一枪: 许多工程师习惯把全局变量extern出来放到.h里面,这里我要很明确的不怕得罪人地表达: 我鄙视这种不成熟的做法。

。。。。。。。。。。。。

说这话的人,不知道全局变量和静态变量的区别,建议他先去看看编译原理,再回来发言。

使用特权

评论回复
92
呆板书生| | 2013-11-10 08:56 | 只看该作者
            lcd_init(void)
                    {
                             lcd_contrast_set (sys_para.lcd_contrast);    /* 我最鄙视的全局变量风 */
                             or
                             lcd_contrast_set ( get_sys_para_lcd_contrast() ); /* 我次鄙视的层次不分明的风格 */
                     }
                     这个事儿,比较恰当的做法是。
                     lcd_init (uint_fast8_t contast)
                     {
                             /* 接下来你懂的  */
                     }


void lcd_init(void)是标准的做法,而 lcd_init (uint_fast8_t contast) 却是我所摒弃的做法,

为什么这样呢,大家可以讨论一下。

void lcd_init(void),这样我可以作为标准函数接口,写在我的头文件里,在任何一个工程都不需要修改

如果下一个工程,要求初始化时加入lcd的x,y,坐标,怎么办?

对于void lcd_init(void)的做法,上层架构不改,.h文件不改,(我懒人一个,喜欢把以前的抄过来),只需要改动void lcd_init(void)的实现方式,和sys_para的值。

而楼主的方式呢....


结语:每个人都有自己做事方法,我们提倡百花齐放,没有一种方法是绝对好的。

所以,楼主有什么好的心得,只能建议别人如何做,或者对某种其他的做法提出讨论意见,但不应该随意鄙视别人的做法。

使用特权

评论回复
评论
xlsbz 2013-12-19 20:35 回复TA
如果下一个项目不是lcd,如果是vcd怎么办呢? 所以就cd_init(void), 
评分
参与人数 1威望 +2 收起 理由
xiang2580 + 2 明显lcd_init()好移植,程序员越懒越聪明!.
93
呆板书生| | 2013-11-10 09:07 | 只看该作者
继续:

第一个项目:

在主程序中,

sys_para.line = 0;
sys_para.col  = 0;

lcd_init();

第二个项目:

在主程序中,因为要有个标题所以初始化在第二行

sys_para.line = 1;
sys_para.col  = 0;

lcd_init();
很清晰
-------------------------------------------------
如果LZ的做法,
lcd_init(1);     //传递了行参数,

看起来似乎很简洁,

但对于下一个维护人员,就要查半天才知道这个参数是行参数。而不是列参数




使用特权

评论回复
94
sedatefire|  楼主 | 2013-11-10 09:45 | 只看该作者
呆板书生 发表于 2013-11-10 07:48
第一枪: 许多工程师习惯把全局变量extern出来放到.h里面,这里我要很明确的不怕得罪人地表达: 我鄙视这种 ...

不明白你的意思,请详告之。
我要表达的是,不需要有任何一个extern全局变量。
extern意味着public,意味把读写权限拱手相让,意味着没有下限,意味道德将沦丧,系统将混乱。

使用特权

评论回复
95
sedatefire|  楼主 | 2013-11-10 09:52 | 只看该作者
呆板书生 发表于 2013-11-10 08:56
void lcd_init(void)是标准的做法,而 lcd_init (uint_fast8_t contast) 却是我所摒弃的做法,

为什么这 ...

1. 请问,我如果想单独移植lcd_module.c这个文件,是否要把你的sys_para那套一起搞过来呢?
我只要lcd_module.c,你却说,不行啦,sys_para这套要一起过去才能编译啦,不然你contrast的参数传不进去,编译也会报错的。你这不是**我吗?

2.通常改变对比度这个事情是开发给用户的。请问你会如何操作呢。
  sys_para.lcd_contrast = 用户输入值;
  lcd_init();
是这样吗?
或者至少也得是这样吧,
  lcd_contrast_set(用户输入值);
  sys_para.lcd_contrast = 用户输入值;


我提出的观点,其背后的目的是为了架构清晰,移植方便, 模块间尽量不要纠缠不清,同时兼顾效率。

使用特权

评论回复
96
sedatefire|  楼主 | 2013-11-10 09:55 | 只看该作者
呆板书生 发表于 2013-11-10 09:07
继续:

第一个项目:

如果是这样
我会很慎重的给出接口
set_line_col(uint_fast16_t line,  uint_fast16_t col);
我不会傻到改变行列值,就要lcd_init
lcd_init在多数情况,是会把lcd复位一次,清屏一下的。
仅仅改变行列,还不至于需要如此的大动作。

使用特权

评论回复
97
sedatefire|  楼主 | 2013-11-10 09:58 | 只看该作者
sedatefire 发表于 2013-11-10 09:55
如果是这样
我会很慎重的给出接口
set_line_col(uint_fast16_t line,  uint_fast16_t col);

不过话说回来,我就是要赤果果地嘲笑。
嘲笑方能引人注意,才能有愤青按奈不住与我对骂,我才能度化更多人。
帖子能上首页,尔后才能引起更多人注意。
如此循环无端,妙矣。
哇~,哈哈,哈哈

使用特权

评论回复
98
dianzijiangren| | 2013-11-10 16:13 | 只看该作者

使用特权

评论回复
99
呆板书生| | 2013-11-10 18:24 | 只看该作者
sedatefire 发表于 2013-11-10 09:45
不明白你的意思,请详告之。
我要表达的是,不需要有任何一个extern全局变量。
extern意味着public,意味 ...
extern意味着public?


对于编译系统来说,只要是全局变量,不管你有没有写上 extern,一样是public,

understand?

你不明白?

做个实验,

在file1.c 中写一个全局的 cnt 变量,
在file2.c 中写一个全局的 cnt 变量,

整个工程对这两个cnt,都没有写 extern, 但最后连接的时候,会出错,

再做一个实验:
在file1.c 中写一个带 static 的 cnt 变量,
在file2.c 中写一个带 static 的 cnt 变量,

程序运行,正常。

你当然可以说,你不会写这样的程序,

但,......................................



使用特权

评论回复
100
呆板书生| | 2013-11-10 18:32 | 只看该作者
sedatefire 发表于 2013-11-10 09:52
1. 请问,我如果想单独移植lcd_module.c这个文件,是否要把你的sys_para那套一起搞过来呢?
我只要lcd_mo ...
1. 请问,我如果想单独移植lcd_module.c这个文件,是否要把你的sys_para那套一起搞过来呢?


看来,不算傻

sys_para.lcd 这个参数本来就放在 lcd_module.c 文件里,你喜欢怎么移植就移植

行,列参数,只是举例而已,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则