有一函数如下,不明白

[复制链接]
3027|16
 楼主| szhgx26 发表于 2007-7-13 12:53 | 显示全部楼层 |阅读模式
有一函数如下,不明白,请高手指点!调用时是否可也用指针取argument?如何调用?
Uint32 mmc_read_response (void)
{  
   Uint32  argument;  
   ((Byte*)&argument)[0] = MMCMD;    /* dummy index read */  
   ((Byte*)&argument)[0] = MMCMD;  
   ((Byte*)&argument)[1] = MMCMD;  
   ((Byte*)&argument)[2] = MMCMD;  
   ((Byte*)&argument)[3] = MMCMD;  
   return argument;
}
ayb_ice 发表于 2007-7-13 13:08 | 显示全部楼层

这是强制指针变换...

guoqi 发表于 2007-7-13 16:02 | 显示全部楼层

?!

把一个32bit的int型变量拆成4个char.
强制转换!
guoqi 发表于 2007-7-13 16:11 | 显示全部楼层

!!!!!!!!!!

和这段CODE功能一样。
    unsigned char *temp;
    temp = (char *)&arg;
    temp[0] =...
guoqi 发表于 2007-7-13 16:12 | 显示全部楼层

????????

不好意思

temp = (unsigned char *)&arg;
平常人 发表于 2007-7-13 16:22 | 显示全部楼层

这是一种偷懒的写法,不建议采用

建议用下面的写法,这也是C语言中引入union的初衷。

Uint32 mmc_read_response (void)
{
   union {
     Uint32  argument;
     unsigned char carg[4];
   } arg;

   arg.carg[0] = MMCMD;    /* dummy index read */  
   arg.carg[0] = MMCMD;  
   arg.carg[1] = MMCMD;  
   arg.carg[2] = MMCMD;  
   arg.carg[3] = MMCMD;  
   return arg.argument;
}
doob 发表于 2007-7-13 22:18 | 显示全部楼层

hehe

  还是这样明白些,高手总爱搞些花的。。
zjf0000 发表于 2007-7-13 22:41 | 显示全部楼层

不建议用union

程序移植有很多的问题。
平常人 发表于 2007-7-13 22:44 | 显示全部楼层

请zjf0000明示程序移植是有什么问题?最好有个例子

个人认为,如果union有问题,那么使用指针的问题会更大。
linfeng133 发表于 2007-7-13 22:46 | 显示全部楼层

union是标准C语言

union是标准C语言
zjf0000为什么说移植会有问题?能说说吗?
HOTPOWER 发表于 2007-7-13 23:01 | 显示全部楼层

哈哈~~~union处处可见~~~WINDOWS的API中很多~~~

俺做菜鸟处处用~~~

class SystemObj
{
private:
    unsigned char Count;
public:
    SystemObj(void);
    void Init(void);
    void PortInit(void);
    void LedInit(void);
public:
    volatile unsigned int RamTest;
    union
    {
        volatile unsigned char SystemFlag;
        struct
        {
            unsigned char MainExecFlag: 1;
            unsigned char EInt0ExecFlag: 1;
            unsigned char EInt1ExecFlag: 1;
            unsigned char Timer0ExecFlag: 1;
            unsigned char Timer1ExecFlag: 1;
            unsigned char Timer2ExecFlag: 1;
            unsigned char UsartTxExecFlag: 1;
            unsigned char UartRxExecFlag: 1;
        };
    };
};


xwj 发表于 2007-7-14 02:02 | 显示全部楼层

我觉得:正好相反,用union正好可以避免union移植问题

编译器也能得到最好的优化
su_mj000 发表于 2007-7-14 03:56 | 显示全部楼层

big endian v.s little endian

平常人 发表于 2007-7-14 08:33 | 显示全部楼层

I agree "big endian v.s little endian" may cause problems

But using pointers may cause the same problem as union.

Come on, give me more examples.
古道热肠 发表于 2007-7-14 11:58 | 显示全部楼层

都整些英文,忽优不会英语的

  本人觉得6楼平常人的的写法很规范,值得提倡。这种应用存在大小端问题,用C语言时要根据编译环境与单片机的特性进行定位,一定要心中有数,C51和LPC2114就不一样。
太阳之母 发表于 2007-7-14 15:52 | 显示全部楼层

同意6楼

hqgboy 发表于 2007-7-14 16:54 | 显示全部楼层

联合不错...

您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

164

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部