结构体与联合体

2020-01-21 21:33发布

最近接手了别人做的一个项目,问题不少。
在阅读程序的过程中看到其变量定义上的做法很是让我费解,也让我很郁闷。
他的做法如下,是在联合体里嵌套了多个结构体:

typedef  union  _RUN_PARAM{
        unsigned char         array[21];       
        struct
        {
                unsigned char         name;                                // 0                       
                unsigned char         run_status;                        // 1
                unsigned char         wash_pos;
                unsigned char         solvent_num;
                unsigned char         spe_num;                        //4// 4
                unsigned long                 count;                                // 5
                unsigned int                 atuo_wash;
                unsigned int                 speed_last;
                unsigned int                 second;
                unsigned int                 speed;
                unsigned long                 recycle;       
        }path_sol;
        struct
        {
                unsigned char         name;                                // 0                       
                unsigned char         run_status;                        // 1
                unsigned char         wash_pos;
                unsigned char         back_num;
                unsigned char         spe_num;                        //4// 4
                unsigned long                 count;                                // 5
                unsigned int                 speed_push;
                unsigned int                 count_push;
                unsigned int                 second_push;
                unsigned int                 speed;
                unsigned long                 recycle;       
        }path_sam;
        struct
        {
                unsigned char         name;                                // 0
                unsigned char         run_status;                        // 1
                unsigned int                 temperature;
                unsigned char                spe_num;                        //4// 4
                unsigned long                 count;                                // 5
                unsigned long                 times;
                unsigned int                 second;
                unsigned int                 speed;
                unsigned long                 recycle;
        }path_other;
}run_param;

而据我用过的新唐单片机里的写法刚好跟他相反,是结构体里嵌套联合体。
众所周知,union模型是共用一段内存,如果是里面再嵌套了struct,那在后续变量操作时难免会互相修改,从而增加产生BUG的机率。
我不知道这个人这样做的目的何在,可能是为了省内存(因为公司想要马儿跑又要马儿不吃草,用资源很少的单片机来做太多的事),但是会想到省内存的人
不会不考虑到互相更改的可能。也许这样的写法有其巨大的好处但我确实看不出来,因为我也是遇到问题才去研究。
当然若有论坛牛人经过也请放缓脚步,为我这种新手普及一下知识。
此只是发发唠骚,不喜勿喷。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
92条回答
second_chan
1楼-- · 2020-01-31 16:28
围观。。。表示没用过
ggchao
2楼-- · 2020-01-31 17:04
首先用一个数组也能实现相同的功能,但是使用数组就涉及到以后升级的话,改动会很大,因为可能很多index都要修改,而且这里面还用了不同的变量类型(unsigned long, unsigned char, unsigned int)更加难以控制;再有使用结构体的好处嘛,取成员操作方便,实现通信协议或类似的软件不容易出错。个人见解而已。
rockyyangyang
3楼-- · 2020-01-31 18:12
这种方法真是很好用,不是为了节省内存,为了方便数的操作,至少你可以用这样的方法来代替之前的左移右移!计算更快!
zhdiamond
4楼-- · 2020-01-31 20:20
学习了!受教~!
太极风436
5楼-- · 2020-01-31 23:51
 精彩回答 2  元偷偷看……
myh_hh
6楼-- · 2020-02-01 00:49
mark  学习了

一周热门 更多>