C位域总结

经过个人查阅相关的资料和理解,现对C语言的位域做一个总结,对于位域的定义我在这里没有多说,这里主要是对位域有歧义的地方进行系统的总结。个人觉得总结的比较完整,如有不够完整或有异义的地方大家可以留言指点。

  1. 位域又叫位段(位字段),是一种特殊的结构成员或联合成员(即只能用在结构或联合中),用于指定该成员在内存存储时所占用的位数,从而可以在机内更紧凑地表示数据。
  2. 位域的使用主要出现在如下两种情况:
    (1)当机器可用内存空间较少而使用位域可以大量节省内存时。如,当把结构作为大数组的元素时。
    (2)当需要把一结构或联合映射成某预定的组织结构时。例如,当需要访问字节内的特定位时。
  3. 当要把某个成员说明成位域时,其类型只能是int,unsigned int与signed int三者之一(说明:int类型通常代表特定机器中整数的自然长度。short类型通常为16位,long类型通常为32位,int类型可以为16位或32位。各编译器可以根据硬件特性自主选择合适的类型长度。见The C Programming Language中文 P32)。
  4. 带位域的结构在内存中各个位域的存储方式取决于具体的编译程序;它们既可以从左到右,也可以从右到左存储。
  5. 在一包含位域说明的强构或联合区分符中也可以同时说明普通成员,例如:
    struct st1
    {
    unsigned a:7;
    unsigned b:4;
    unsigned c:5;
    int i; //i是普通成员,这会被存放在下一个字,即字对齐
    };
  6. int值不能跨字存放,同样位域也最好不要跨字存放(意思说是说:各位域的分配位数加起来要在16位或32位以内,如果编译器分配int为16位,则加起来要在16位以内,如果加起来大于16位,则最好空出剩余的位域,从下一个字开始分配位域)。
  7. 特殊宽度0或者说长度为0的无名位域有着特殊的用途。它用于指示将其前后的两个位域或成员分开放在两个字中, 即将位于该无名位域后的下一个位域从下一个字开始存放。
  8. 位域备注:
    关于位域还需要提醒读者注意如下几点:
    其一,位域的长度不能大于int对象所占用的字位数。例如,若int对象占用16位,则如下位域说明是错误的:
    unsigned int x:17;
    其二,由于位域的实现会因编译程序的不同而不同,在此使用位域会影响程序的可移植性,在不是非要使用位域不可时最好不要使用位域。
    其三,尽管使用位域可以节省内存空间,但却增加了处理时间,在为当访问各个位域成员时需要把位域从它所在的字中分解出来或反过来把一值压缩存到位域所在的字位中。
    其四,位域的位置不能访问,因些不能对位域使用地址运算符号&(而对非位域成员则可以使用该运算符)。从而,即不能使用指向位域的旨针也不能使用位域的数组(因为数组实际上就是一种特殊的指针)。另外,位域也不能作为函数返回的结果。
    最后还要强调一遍:位域又叫位段(位字段),是一种特殊的结构成员或联合成员(即只能用在结构或联合中)。

说明:以上大多数文字摘自《ANSI C标准详解》及《The C Programming Language中文第二新版》。

C语言中的位域详解

在失业一个月后终于在今天又开始上班了,来到新公司的第一天便分配到一个任务–用富士通单片机做一个仪表控制。说实话不用单片机已经两年多了,很多东西都已经忘掉,以至于在看程序时都不知道位结构是什么东西了,赶紧上网搜索一下,原来是这么回事……

位结构
位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构比按位运算符更加方便。位结构定义的一般形式为:

struct位结构名{
数据类型 变量名: 整型常数;
数据类型 变量名: 整型常数;
} 位结构变量;

其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。变量名是选择项, 可以不命名, 这样规定是为了排列需要。

例如: 下面定义了一个位结构。

struct{
unsigned incon: 8;  /*incon占用低字节的0~7共8位*/
unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
unsigned blink: 1;  /*blink占用高字节的第7位*/
}ch;

位结构成员的访问与结构成员的访问相同。
例如: 访问上例位结构中的bgcolor成员可写成: ch.bgcolor

注意:
1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针, 如果是指针, 其成员访问方式同结构指针。
3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字节。
4. 位结构成员可以与其它结构成员一起使用。

例如:

struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned state: 1;
unsigned pay: 1;
}workers;’

上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。

菊子曰 这就是菊子曰啦!

搜集一些UltraEdit注册码

作为程序员一定会用到一些文本编辑器,其中ultraedit是比较受欢迎的一个款,然后ultraedit不是免费软件,如果需要完整功能那就得注册购买。如果你不想支付任何费用,也可以使用下面的注册码,不一定个个能用,不妨试试吧。下载UltraEdit请去http://www.ultraedit.com.

最新的15.10.0.1019的注册码:
用户名:fuck you
注册码:QMPFM-INRPV-LLOK8-KGRLM-NJKFA-ELWOV-JKDPQ-PQJMP

用户名:fuck you
注册码:FHKDG-ICNNI-PPHIU-OJETF-LIJDV-IIQGG-RJBKD-PMBRX

注册名:WWW.GREENDOWN.CN
注册码:DKIT2-NURNA-ILMGD-QFOKO-HJGNP-KEJII-NGQF8-TEVMV

注册名:WWW.GREENDOWN.CN
注册码:ELGH3-DRRNK-ILMG3-QFOKI-HJGNV-KEJJV-JMORX-RFWOQ

注册名:Free User
注册码:FFGLU-KDKFS-JNGGH-QRATU-JMJLN-HKLKG-MLDKC-OOIOK

注册名:bablue
注册码:MGCHB-KCJGX-RKHLV-QKCSW-KMJLJ-JIQOP-KQCJR-TPJVV

注册名:icycool and everybody
注册码: K7V0U-O6Q6W-E6J9Q-H2C9P-XW24V-0J441

注册名:UltraEdit/UltraEdit-32
注册码:FJHFW-QDQIG-LKHHW-UIGUU-ELJHH-NKRKQ-QLEJK-ORAMH

注册名:www.orsoon.com
注册码:HKJMW-HGLMQ-NJJKW-WKBNW-LLHGL-LFNGB-LOBLG-UMEPL

注册名:wangxiang
注册码:DLHJB-NBNGJ-RMBIC-KPIMS-JEFIN-QGOOD-PMJMV-OQHRI

三维坐标变换

三坐标测量软件中最常的变换就是三维坐标变换,因为坐标旋转全靠它了,如果要搞这方面的东西,一定要熟悉坐标变换的,现在就来复习一下吧。
最简单的公式(3d)
空间三维向量:
单位矩阵:
|1 0 0 0|
|0 1 0 0|
|0 0 1 0|
|0 0 0 1|
沿(x,y,z)分别移动(a,b,c), 乘于
|1 0 0 0|
|0 1 0 0|
|0 0 1 0|
|a b c 1|
RotateX=A then mul
|1 0 0 0|
|0 cosA sinA 0|
|0 -sinA cosA 0|
|0 0 0 1|
RotateY=B the mul
|cosB 0 -sinB 0|
|0 1 0 0|
|sinB 0 cosB 0|
|0 0 0 1|
RotateZ=C then mul
|cosC sinC 0 0|
|-sinC cosC 0 0|
|0 0 1 0|
|0 0 0 1|
缩放(u,v,w), then mul
|u 0 0 0|
|0 v 0 0|
|0 0 w 0|
|0 0 0 1|
有一个点 它的局部坐标是(X、Y、Z)
我们把4×4矩阵的最后一行信息提取出来 它为(X Y Z 1)
我们要得到它在世界坐标(x、y、z) 那么
(x、y、z)=(X、Y、Z)×世界矩阵 (变换矩阵)

最终 我得到了我需要的结论:
B的世界坐标=B的局部坐标×B的世界矩阵
进行简单的换算就能得到:
B的局部坐标=B的世界坐标×B的世界逆矩阵

MDM三坐标改造历程6

3月13日,今天这边又只是我一个人干活了,早上过来发现昨晚用的气源被拔掉了,而且空压机的电源也被掐掉了,这帮人啊,怎么这么不配合工作呢,找那些个工人师傅,没有一个能解决问题的,我就等啊,等到厂长过来我和他说了,随便说了两句鸟语我没听懂后,他就走开了,完全不吊我啊,他妈的什么世道,我过来给他们做事竟然这样对我,真他妈的憋火。

 

后来,拿着气管到另外一个接头试了一下,竟然可以,没想到今天那个接头的压力还不小,凑乎先用吧,懒得再去找他们了。几经测量分析后终于发现速度上不去的原因,心里那个乐呀,呵呵,不错,终于能让机器跑起来了,后面的问题基本不大了。唯一剩下的就是如何解决Z轴的光栅问题,这个事情,我也只能尽力而为喽。

呵呵,虽然累了几天,终于还是看到了希望。

MDM三坐标改造历程5

3月12日,开始焊接所有的接口线,调整光栅读数头的位置。最好调整的要算X轴,因为是贴在横梁上的,所以调好间隙后,只有很少几个地方有点闪烁红灯,再稍微调整一下后,也就基本都正常了,满行程滑动一下后没有发现红灯现象,这个轴的光栅就OK了。

 

Y轴本该不会比X轴难调的,但是原先的气浮块安装有点问题,间隙相当的大,在推动该轴的过程中明显发现气浮块相对于导向面的间隙在变化,所以又让那个师傅想办法调整一下间隙,这个师傅果然还是有点办法的。在调整间隙后,读数头的位置就很容易搞定了。最麻烦还是Z轴呀,长条板的变形是不可避免的啦,而且上面只有两个孔位,这种薄板真的是相当麻烦(以后千万不要用这种做法了)。那倒吧,先不管这个轴了,调试另外两个轴的运动吧。通上电后打开控制器,让电机转了转,妈呀!速度出奇的慢,难道是减速比太大了?不可能吧,要是这样原先的机器是怎么用的啊。难道是我设置的参数有问题?我反复修改参数,不停的加大速度和加速度,还是无济于事,折腾的呀。一直搞到7点多也没有找出原因。要不休息一下明天继续吧,嗯!是个不错的想法,再说我也饿了啊。

MDM三坐标改造历程4

3月10日,上午搞一些乱七八糟的东西,中午的时候那个搞机修的师傅过来了,他是给人修机床的,比起我来在机修方面那要在行多了,应是十八般兵器样样都精通吧。呵呵,钻孔打洞攻丝,安装布线槽,虽然有点费时但是工作做的还算顺利,看来做任何事情还是要讲究分工的啊。

 

3月11日,开始布线,弄气管,都是他妈的体力活。干了好几天,一直都是站着的,搞得真的有点吃不消。其实这样的事情真不适合我来做啊(又想发牢骚了)!随后在装上读数头的支架,贴光栅尺,原本觉得光栅尺这么精密的东西可不好贴吧,后来发现是配有工具的,哈哈,这下对我来说就没有什么难度了。虽说知道怎么去弄,但是还是要小心啊,毕竟这玩意1mm就要2块多钱呢,凭着我的聪明才智和细心的工作作风还是很快就搞定这些的(嘿嘿,偶尔吹吹牛)。就这么弄弄就是一天啦。太累,腰快折了。

MDM三坐标改造历程3

3月9日,整理一下机器后便去买电线,顺便取回加工的支架和长条块,回来后就准备试着安装读数头。搞了半天竟然没有可用来安装支架的螺钉,厂家的保管员休息哦,不上班了。我晕!客户说他有事要先回东莞去了,让我自己在这先弄着,随后找个搞机械的师傅来帮忙,靠!

 

他倒好把这些事都推给我来做了,把我当作廉价劳动力来使啊,我怎么也是个堂堂重点大学的硕士毕业啊,现在也任我们技术部的副经理了呀,怎么竟让我干机修工的活了。苍天啊…… 唉…… 客户就是上帝呀,再苦再累我也得干啊,否则回去怎么向老板交代呢,干吧!天天干得满手都是油污,还要爬上爬下的,站在机器的横梁上我的腿还真的有点抖呢(不好意思我有点恐高)。

MDM三坐标改造历程2

3月8日上午过去拿着图纸对照着三坐标机再确认了一下,然后拿去打图纸。晕,他们竟然无法打开CAD文件,看来还是要先转换成PDF才行。还在电脑里有个Adobe Acrobat 7.0 Professional(呵呵,有注册码的哦),有了它转换也就不成问题了,抓紧啊,后面的工作还很多呢,很快搞定后拿着图纸去找地方加工,

 

还好客户自己有车子(有个代步的工具就是好啊),而且这边搞模具加工的小作坊也挺多的,所以加工这样的小零件也是很轻松的。当然还有一个问题就是加工那个长条可不那么好搞哦,很多家都不愿意做的,最后找到一家答应用铝板来做,没办法只好先加工出来看吧,变形是不可避免的啦。几个小东西加工还要一天呢,没办法,回去先想想怎么布线吧。

回来后将原先的线槽和电线全部拿来看了一下,里面有些线还可以用,但是还得再去弄些电机的电源线,现成的只有电机反馈线可用了,光栅信号线也要重新弄,就这样量好每根线的大概长度后,开始清洁机器,真是脏呀,怎么能这么残忍的对待这样一台精密测量仪器呢!洗刷刷,洗刷刷……

终于搞得像台机器了,我也该回去休息了……

MDM三坐标改造历程1

因为卖了一套控制系统给东莞的一个客户,3月5号便出发到东莞。原本是将这套系统应用于客户自制的一台三坐标的,但是客户自己的机器尚未做好,而且他们却接了一个改造的单子,于是就决定把这套系统配这台要改造的机器了。

 

3月7号来到佛山,见到这台机器,Italy MDM制造的,第一次看到做的这么大这么笨重的机器,听说行程只有1700×1200×700,但是机台就有3000×1700×3500,台面的厚度大概有400mm吧,支架、横梁和Z轴全部是用钢和铸铁做的,气浮块更是吓人,Y轴用了足有1200×200×50mm的4个大铁块,X轴和Z轴的气浮块也用几块钢板(也可能是铸铁,反正都是铁的啦)做成的。Z轴的平衡采用铅块来配重。X和Z轴用钢线摩擦传动,Y轴的传动类似滚珠丝杠,其实是根光杠,这样做倒是觉得比滚珠丝杠更好一些,可以允许打滑嘛,对电机也能起到一定的保护作用。原先的光栅已经不见了,听说是玻璃尺,以至于Z轴上都没有可以贴反射式光栅的位置了(郁闷,工作难度又加大了点)。

下午开始试电机,电机上什么标志都没有,只有前端加的减速器有标志,哪个公司的我也不是很清楚,用我做的系统试了一下,还好可以动的,就是速度相当的慢,但是既然能动就说明电机还是好的,这样也就省得更换电机了。就这样也忙活了一下午,尤其是给电脑里装控制卡,这里的厂家工作相当不配合,用他们的计算机装块控制卡搞得他们唧唧歪歪的,真他妈的让人不爽,而其都说鸟语,弄得我常常听不懂他们在说什么。当年秦始皇统一文字时怎么不统一要求说普通话呢,这一点就没有英语做的好了,弄得同一个国家里交流都有障碍,面对这样的事情真是无话可说。

不能扯远了,还是看看这个机器的光栅怎么装吧。粗略看了一下,发现X、Y轴光栅安装应该没有什么问题,但是要想办法固定读数头,这就要想办法做几个安装的支架了,还好这些问题都难不倒我的,一会便想好怎么做这些支架,但是X轴上必须要钻螺孔,否则无法安装支架,这个钻孔的活我可就不在行了,还好客户这边能请到别人过来帮忙,我就只要计算出螺孔的位置就可以了。麻烦的是Z轴无法让光栅贴到滑动的部分上去,看来只能固定光栅尺,而让读数作相对运动了,但是如何选择位置贴光栅是个问题,,因为没有相对平整的平面啊。这样只有另外制作一个长条板了,由于考虑到外壳的安装所以没有敢设计一个较厚的长条板,一切就这样定下了。晚上吃完饭回到酒店后就着手开始画零件图,现装CAD,然后边回忆尺寸边画图,一直弄到12点左右才搞得差不多。累呀,出差真辛苦,这也是最累的一次。