king1314 发表于 2013-5-23 13:12:52

keil mdk 结构体的问题

本帖最后由 king1314 于 2013-5-23 14:30 编辑

这个是在main.C中定义的全局变量
struct si4432_revdata
{

        unsigned char rssi;
        union
        {
        float ftem;
        unsigned char tembuff;
        } tem;
       
        union
        {
        float fvoltage;
        unsigned char voltagebuff;
        }voltage;
       
} slaveid ;

我用的是keil mdk4.6

我给里面的变量赋值的时候出现如下问题,这是什么原因呢

下面这段代码是在si4432.C代码中


                for(k=0;k<3;k++)
                        {
                                for(i=0;i<4;i++)
                                {
                               
                                        slaveid.tem.tembuff【i】=spi_readreg(0x7f); //本来是[],不然贴上去就没了

                                }
                        }
                                                       
                        for(k=0;k<3;k++)
                        {
                                for(i=0;i<4;i++)
                                {
                                       
                                        slaveid.voltage.voltagebuff【i】=spi_readreg(0x7f);//本来是[],不然贴上去就没了


                                       
                                }
                        }

错误如下:



这是哪里错了呢 ??

bygreencn 发表于 2013-5-23 13:16:52

{:curse:}{:curse:}{:curse:}

king1314 发表于 2013-5-23 13:18:49

bygreencn 发表于 2013-5-23 13:16 static/image/common/back.gif


请多多指教

windboy 发表于 2013-5-23 13:28:57

spi_readreg 返回是什么呢?

king1314 发表于 2013-5-23 13:33:14

windboy 发表于 2013-5-23 13:28 static/image/common/back.gif
spi_readreg 返回是什么呢?

返回的是unsigned char

lcofjp 发表于 2013-5-23 13:41:40

king1314 发表于 2013-5-23 13:33 static/image/common/back.gif
返回的是unsigned char

这就是问题所在,哪有给数组名直接赋值的,都是给数组中的元素赋值。

king1314 发表于 2013-5-23 14:06:27

lcofjp 发表于 2013-5-23 13:41 static/image/common/back.gif
这就是问题所在,哪有给数组名直接赋值的,都是给数组中的元素赋值。

那是粘贴上去出的问题

正确的应该是这样
if((itstatus1&0x02)==0x02)
        {
                        spi_writereg(0x07|0x80,0x01);//Çл»µ½Ô¤±¸Ä£Ê½
               
                        for(k=0;k<3;k++)
                        {
                                for(i=0;i<4;i++)
                                {
                               
                                        slaveadds.tem.tembuff【i】=spi_readreg(0x7f);

                                }
                        }
                                                       
                        for(k=0;k<3;k++)
                        {
                                for(i=0;i<4;i++)
                                {
                                       
                                        slaveadds.voltage.voltagebuff【i】=spi_readreg(0x7f);
                                       
                                }
                        }
                       
                        slaveadds.rssi=spi_readreg(0x7f);
                       
                        spi_writereg(0x0e|0x80,0x01);//ÌìÏß·¢Éä״̬

lcofjp 发表于 2013-5-23 15:36:51

哦,应该是不在同一个C文件中造成的结果;
在另一个C文件中,不明确结构的组成。

king1314 发表于 2013-5-23 18:33:45

lcofjp 发表于 2013-5-23 15:36 static/image/common/back.gif
哦,应该是不在同一个C文件中造成的结果;
在另一个C文件中,不明确结构的组成。 ...


我的struct是在main。c中定义的类型


在si4432.h中找不到此类型



解决办法 : 在si4432中定义struct


感谢 lcofjp

xizi 发表于 2013-5-23 22:12:50

也可把struct slaveid 定义留在main.c中,但要在si4432.c中声明extren slaveid[] .

king1314 发表于 2013-5-23 22:35:09

xizi 发表于 2013-5-23 22:12 static/image/common/back.gif
也可把struct slaveid 定义留在main.c中,但要在si4432.c中声明extren slaveid[] .

那定义struct的类型



struct si4432_revdata
{

        unsigned char rssi;
        union
        {
        float ftem;
        unsigned char tembuff;
        } tem;
       
        union
        {
        float fvoltage;
        unsigned char voltagebuff;
        }voltage;
       
} ;

要放在哪里呢?假如我要放在main.C中,在其他.C文件中怎么引用??

求指导




貌似不能放在MIAN.C中 我试过了


而且

struct si4432_revdata
{

        unsigned char rssi;
        union
        {
        float ftem;
        unsigned char tembuff;
        } tem;
       
        union
        {
        float fvoltage;
        unsigned char voltagebuff;
        }voltage;
       
} ;

只能放在.h文件中   

不知道是不是这样的呢??

lcofjp 发表于 2013-5-23 22:48:18

编译器在使用变量之前是一定要知道变量的类型的,即使用extern声明也还是不知道具体结构体的组成。
因此,结构体的定义必须要出现在si4432.C,可以放在.c中,也可以放在.h中include进来,一般都是放在.h中,然后多个c文件都可以使用这个类型,这样就可以在一个c文件中定义,另一c文件中引用了。

xizi 发表于 2013-5-24 10:08:00

楼上说得对。
定义struct的类型如果放在.c中,则只能该.c文件使用;定义struct的类型放在.h文件中,则可以通过include让多个.c文件使用。哪个.c文件要使用这个struct的类型,哪个.c文件就要include那个.h文件。
具体对楼主的程序,如果把struct slaveid 定义留在main.c中,除了要在si4432.c中声明extren struct si4432_revdata slaveid[] 外,还是要在某个.h文件中定义struct si4432_revdata类型,然后main.c和si4432.c都include这个.h文件。

king1314 发表于 2013-5-24 11:25:14

xizi 发表于 2013-5-24 10:08 static/image/common/back.gif
楼上说得对。
定义struct的类型如果放在.c中,则只能该.c文件使用;定义struct的类型放在.h文件中,则可以 ...

{:2_35:}
呵呵

你总结的很好,的确是这样的

我测过过了

灰常感谢大家
页: [1]
查看完整版本: keil mdk 结构体的问题