打印

有一函数如下,不明白

[复制链接]
2033|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] =...

使用特权

评论回复
5
guoqi| | 2007-7-13 16:12 | 只看该作者

????????

不好意思

temp = (unsigned char *)&arg;

使用特权

评论回复
6
平常人| | 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;
}

使用特权

评论回复
7
doob| | 2007-7-13 22:18 | 只看该作者

hehe

  还是这样明白些,高手总爱搞些花的。。

使用特权

评论回复
8
zjf0000| | 2007-7-13 22:41 | 只看该作者

不建议用union

程序移植有很多的问题。

使用特权

评论回复
9
平常人| | 2007-7-13 22:44 | 只看该作者

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

个人认为,如果union有问题,那么使用指针的问题会更大。

使用特权

评论回复
10
linfeng133| | 2007-7-13 22:46 | 只看该作者

union是标准C语言

union是标准C语言
zjf0000为什么说移植会有问题?能说说吗?

使用特权

评论回复
11
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;
        };
    };
};


使用特权

评论回复
12
xwj| | 2007-7-14 02:02 | 只看该作者

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

编译器也能得到最好的优化

使用特权

评论回复
13
su_mj000| | 2007-7-14 03:56 | 只看该作者

big endian v.s little endian

使用特权

评论回复
14
平常人| | 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.

使用特权

评论回复
15
古道热肠| | 2007-7-14 11:58 | 只看该作者

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

  本人觉得6楼平常人的的写法很规范,值得提倡。这种应用存在大小端问题,用C语言时要根据编译环境与单片机的特性进行定位,一定要心中有数,C51和LPC2114就不一样。

使用特权

评论回复
16
太阳之母| | 2007-7-14 15:52 | 只看该作者

同意6楼

使用特权

评论回复
17
hqgboy| | 2007-7-14 16:54 | 只看该作者

联合不错...

使用特权

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

本版积分规则

45

主题

164

帖子

0

粉丝