打印

不会C的不要进来哦................

[复制链接]
5654|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
耕在此行|  楼主 | 2009-12-17 09:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 耕在此行 于 2009-12-17 13:29 编辑

12. 17   13:26 修改
如果楼主是炫耀你的指针功底或C功底,完全没有必要。

有人说用了指针就牛,其实我认为不是这样子的。我认为用C,只需要符合“最容易理解”+“最快速算法”就OK了。

没有必要去死抠那些个汇编,我用直接">>8"又怎么 ...
wgj_king 发表于 2009-12-17 12:48

有些编译器就是转不过来的.如KEIL C51
=========================================================
自己产品的程序,难道忽悠我自己? 呵呵.
其实还是做法问题 一个是整体移8位 操作移8*4次 一个是移字节 移2次.
整体移8位 程序看起来简单,
字节移8位,单片机工作起来简单.

能明白蓝色部分的指针应该及格了吧!
这个程序并不高深,但我相信很多人不会这么做,觉得麻烦,直接来一句:
     UI_tmp >>= 8;就完事了,
但这么写可能编译成机器码的时候就多了好多字节了.按移位来做,机器周期也会多很多.
/*----------------------------------------------
     计算出电压电流有效值
     在电压=220V 电流等于5A时 ATT7022B读出值大小约等于330*2^13
     330*2^13 约等于 2200*1024
     约等于 5000*512
-------------------------------------------------*/
bin16 cal_UI( bin08 EMad_UI, bin08 n)
     {
     bin32 UI_tmp;
     UI_tmp = 0;
        EM_Cread( EMad_UI, (bin08*)&UI_tmp+1 );
        *((bin08*)&UI_tmp+3) = *((bin08*)&UI_tmp+2);
        *((bin08*)&UI_tmp+2) = *((bin08*)&UI_tmp+1);
        *((bin08*)&UI_tmp+1) = 0;
     UI_tmp >>= n;      /* 读出电压值移10位        除1024  n = 2(前已移8位)
                                      读出电流值移9位           除512    n = 1(前已移8位)
                                      因从ATT7022B读出数据放在UI_tmp的高3个字节,
                                      所以需另外多移8位 */
     return (bin16)UI_tmp;
}
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1

相关帖子

沙发
耕在此行|  楼主 | 2009-12-17 09:13 | 只看该作者
纯属无聊,发上来揍个热闹.  呵呵

使用特权

评论回复
板凳
平常人| | 2009-12-17 09:17 | 只看该作者
故弄玄虚!

既然要另外多移8位,为什么不在一开始就给出合适的指针?真是脱了裤子放屁,:L

使用特权

评论回复
地板
HWM| | 2009-12-17 09:23 | 只看该作者
不仅无聊,而且没趣

为何要写那么多(bin08*)呢?不会给它起个名字?

使用特权

评论回复
5
耕在此行|  楼主 | 2009-12-17 09:25 | 只看该作者
呵呵 读EM是读出的三个字节.

使用特权

评论回复
6
xlsbz| | 2009-12-17 09:27 | 只看该作者
*((bin08*)&UI_tmp+2);括号套的少了点  再多加一个 以确定 & 和 +的优先级哪个 高

使用特权

评论回复
7
耕在此行|  楼主 | 2009-12-17 09:29 | 只看该作者
"* &"的优先级是比"+"要高的.

使用特权

评论回复
8
xlsbz| | 2009-12-17 09:29 | 只看该作者
然后你的命名问题

既然有返回值 那么函数命名cal_UI最好能看出来你的函数是有返回值的

使用特权

评论回复
9
xlsbz| | 2009-12-17 09:31 | 只看该作者
然后是 风格问题
     UI_tmp = 0;

最好弄空格 等号前后各一个空格


     UI_tmp    =    0;

使用特权

评论回复
10
xlsbz| | 2009-12-17 09:32 | 只看该作者
然后就是赋初值的问题

这种写法不值得提倡
bin32 UI_tmp;
     UI_tmp = 0;

最好写成
bin32 UI_tmp = 0;

使用特权

评论回复
11
耕在此行|  楼主 | 2009-12-17 09:34 | 只看该作者
然后你的命名问题

既然有返回值 那么函数命名cal_UI最好能看出来你的函数是有返回值的
xlsbz 发表于 2009-12-17 09:29


这个说得不错.

使用特权

评论回复
12
耕在此行|  楼主 | 2009-12-17 09:34 | 只看该作者
然后是 风格问题
     UI_tmp = 0;

最好弄空格 等号前后各一个空格


     UI_tmp    =    0;
xlsbz 发表于 2009-12-17 09:31

程序里是有空格的.

使用特权

评论回复
13
xlsbz| | 2009-12-17 09:35 | 只看该作者
7# 耕在此行

那么就是认识的问题。

要认识到一点就是:程序不是给自己看的。最重要的是别人能看懂。

使用特权

评论回复
14
耕在此行|  楼主 | 2009-12-17 09:36 | 只看该作者
不仅无聊,而且没趣

为何要写那么多(bin08*)呢?不会给它起个名字?
HWM 发表于 2009-12-17 09:23

自己定义的名称:二进制8位,一看就知道.自己已经习惯了.

使用特权

评论回复
15
耕在此行|  楼主 | 2009-12-17 09:37 | 只看该作者
7# 耕在此行  

那么就是认识的问题。

要认识到一点就是:程序不是给自己看的。最重要的是别人能看懂。
xlsbz 发表于 2009-12-17 09:35

看程序至少也得知道取地址与加号的优先级吧.

使用特权

评论回复
16
xlsbz| | 2009-12-17 09:42 | 只看该作者
看程序至少也得知道取地址与加号的优先级吧.
耕在此行 发表于 2009-12-17 09:37




这就是心理学的问题了!!一个高手的心理。我在一本老外的编程心理学看的。

高手往往非常**自己的观点。但是这不一定总是可取的。

使用特权

评论回复
17
xlsbz| | 2009-12-17 09:43 | 只看该作者
15# 耕在此行

请问 加括号和不加括号 哪一种更好一些?

答案很明显!:lol

使用特权

评论回复
18
xlsbz| | 2009-12-17 09:46 | 只看该作者
怎么样,认识到我这个超级无敌小菜鸟的厉害了吧!!:victory:

使用特权

评论回复
19
HWM| | 2009-12-17 09:49 | 只看该作者
忠告一点:写程序别去忽悠别人(虽然可能是无意的)。因为这样一来,换位思考,别人也会忽悠你。不仅如此,那天你觉得被“别人”忽悠了,查来查去结果是自己忽悠了自己。

使用特权

评论回复
20
耕在此行|  楼主 | 2009-12-17 09:51 | 只看该作者
"((bin08*)&UI_tmp"这本身就是一个整体, 你一定要说再加对括号更好那我也没办法.呵呵.

使用特权

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

本版积分规则

个人签名:知足常乐......

40

主题

1108

帖子

0

粉丝