搜索
bottom↓
12
返回列表 发新帖
楼主: yealien

又是结构体,又外包共用体,这是什么意思呢?

[复制链接]

出0入0汤圆

发表于 2011-7-6 13:28:44 | 显示全部楼层
回复【98楼】waitingconfirm
讨论的意义在于:
不要让某一种做法变成一言堂,更不要让初学者以为谭浩强书中的套路就是绝对正确的,要学会质疑,要有自己的思想

-----------------------------------------------------------------------

是的,所以虽然我跟你在“唱反调”,但我却非常感谢你。
因为这样的讨论,能让初学者们得到比教条式的教育多得多的东西。

出0入0汤圆

发表于 2011-7-6 13:52:26 | 显示全部楼层
此帖经典,,先MARK下,,再细看

出0入0汤圆

发表于 2011-7-6 14:02:23 | 显示全部楼层
事实上前两天我就测试过keil c的位域了
说实话位域编译出来的代码质量非常非常差
这点上waitingconfirm说的没错。

keil c做了大量的改变,这一点他说的也没错

不过在我看来,keil c的改变还不能说是错误的或者说是失败的
首先,它和c标准的差异不能说是缺点,除非你认为C是绝对真理,毫无修改的必要
其次,51的c目前还真没发现什么可以替代的产品,sdcc没有资料,普通人所能接触到的51开发工具,
除了汇编就是keil啦
另外我个人意见,keil对c的改变不是多了而是少了,
我宁愿keil牺牲可移植性,甚至于它都可以不再叫c语言,我也希望它有更强的功能,更强的性能
比如位域,它完全可以编译出更好的位域的代码出来

waitingconfirm说的这句话我非常赞同:
不要让某一种做法变成一言堂,更不要让初学者以为谭浩强书中的套路就是绝对正确的,要学会质疑,要有自己的思想

其实这个帖子争论了这么多只是因为大家看重的东西不一样,有人强调标准化,强调可移植性,
有人并不太看重这些

所以我的观点就是,除非位域一无是处,在任何方面都比另一种方案要差
否则,就有人看重这些优点而选用位域,在这种情况下,位域的存在是合理的

出0入0汤圆

发表于 2011-7-8 10:01:02 | 显示全部楼层
回复【83楼】Cliff
-----------------------------------------------------------------------

开玩笑,花钱就留住人?让你天天守着你5年前开发的东西,你干?某人想创业,你留他?再说了,“周扒皮”是姓“周”!!!!呵呵

出0入0汤圆

发表于 2011-9-8 16:17:45 | 显示全部楼层
众说纷纭  ,哎 要因具体情况而定了;

出0入0汤圆

发表于 2011-9-8 17:18:25 | 显示全部楼层
没想到这个帖这么火。

出0入0汤圆

发表于 2011-9-14 10:49:59 | 显示全部楼层
个人认为这个东西本身没什么讨论,楼主的本意也不是如此,他很无辜,他只是想知道这段定义是什么意思而已。。。

之前不太熟悉位域的时候一直用移位,熟悉了之后两个都用,确实从程序编译出的代码的效率和执行的速度而言,位域远远不如移位(可以位操作的单片机位域的效率可能会高一些),位域的执行在程序可读性上比移位好得多,但是牺牲了效率,这个并不是说一定要用后者,前者一定不能用,存在即合理,C允许这样的定义存在,那就说可以用,那想用就用呗。。。还有大小端问题,dsp,stm32,pic这些的头文件或者库都用过位域,我还没有听说过,stm32的头文件从iar移植到keil或者stvd上就不能用了例子,说明在主流编译器上使用的位域不存在大小端问题。

个人认为,keil C 51的非标准性是因为51这块内核,由于这个51的特性,keil才创造出了这么多非标准,但是它基本还是想要符合标准的,51之后出现的编译器也是越来越向标准靠拢了。。。

纯属个人观点

出0入0汤圆

发表于 2011-9-14 11:12:01 | 显示全部楼层
这种写法倒是偶尔看到过,不过不怎么用。谭浩强教材也提到过这种位写法,对资源锱铢必较的可以考虑这样用。

出0入0汤圆

发表于 2011-9-14 14:10:10 | 显示全部楼层
争论的好激烈啊。

出0入0汤圆

发表于 2011-9-14 16:49:09 | 显示全部楼层
我还是那句话,位域这玩意儿被创造时,用在PC的编程上没有意义,但是在嵌入式系统中却非常的棒。

假设一个外设的8位控制寄存器ASE如下定义:

PS3 PS2 PS1 PS0 MD1 MD0 TSE CNS
其中PS3~0取值0000~1111,或者Para00~15。PS1~0取值00~11,或者MODE0~3,TSE是一个位,CNS是一个位.
所以根据各个位的位置定义移位次数:
CNS=0
TSE=1
MD=2
PS=4


如果要初始化这个寄存器Para07,MODE3,TSE=0和CNS=1。

标准位操作写法:
ASE|=(Para07<<PS)|(MODE3<<MD)|(0<<TSE)|(1<<CNS);
编译之后就是ASE|=0x79;

如果用位域方式(从左到右,如果是相反的就在这里颠倒一下,没有多少工作量):
struct  REG_DFE{        
                        char        CNS:1;
                        char        TSE:1;
                        char         MD:2;
                        char         PS:4;
                };

union KZS{
                struct REG_DEF REG;
                unsigned char  REG8;
         };
union KZS ASE;

所以这是就变成了:

ASE.REG.CNS=1;
ASE.REG.TSE=0;
ASE.REG.MD=MODE2;
ASE.REG.PS=Para07;

当然也可以直接用ASE.REG8=0x79;

哪种方式看着直观,一目了然。


关于程序的移植,比如从51到AVR,涉及到端口和外设操作的,基本等于重写。简单说只有+-×÷这些运算用不着修改。

出0入0汤圆

发表于 2011-9-14 17:23:29 | 显示全部楼层
看了 帖子  理解了更加深了 一步!!!

出0入0汤圆

发表于 2011-9-14 17:31:31 | 显示全部楼层
MARK,经典的讨论

出0入0汤圆

发表于 2011-9-30 00:48:07 | 显示全部楼层




出0入0汤圆

发表于 2011-10-20 22:56:11 | 显示全部楼层
晚上浏览论坛,会发现很多经典的帖子,mark

出0入0汤圆

发表于 2011-10-24 08:22:19 | 显示全部楼层
有意思!

出0入0汤圆

发表于 2012-2-6 20:52:21 | 显示全部楼层
这个也讨论那么久???

出0入0汤圆

发表于 2013-10-17 21:12:06 来自手机 | 显示全部楼层
C语言,学习

出0入0汤圆

发表于 2013-10-18 15:40:16 | 显示全部楼层
存在即是合理的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-25 19:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表