搜索
bottom↓
回复: 13

keil mdk 结构体的问题

[复制链接]

出0入0汤圆

发表于 2013-5-23 13:12:52 | 显示全部楼层 |阅读模式
本帖最后由 king1314 于 2013-5-23 14:30 编辑

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

        unsigned char rssi;
        union
        {
        float ftem;
        unsigned char tembuff[4];
        } tem[3];
       
        union
        {
        float fvoltage;
        unsigned char voltagebuff[4];
        }voltage[3];
       
} slaveid[20] ;

我用的是keil mdk4.6

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

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


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

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


                                       
                                }
                        }


错误如下:



这是哪里错了呢 ??

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-5-23 13:16:52 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2013-5-23 13:18:49 | 显示全部楼层
bygreencn 发表于 2013-5-23 13:16

请多多指教

出0入0汤圆

发表于 2013-5-23 13:28:57 | 显示全部楼层
spi_readreg 返回是什么呢?

出0入0汤圆

 楼主| 发表于 2013-5-23 13:33:14 | 显示全部楼层
windboy 发表于 2013-5-23 13:28
spi_readreg 返回是什么呢?

返回的是unsigned char

出0入0汤圆

发表于 2013-5-23 13:41:40 | 显示全部楼层
king1314 发表于 2013-5-23 13:33
返回的是unsigned char

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

出0入0汤圆

 楼主| 发表于 2013-5-23 14:06:27 | 显示全部楼层
lcofjp 发表于 2013-5-23 13:41
这就是问题所在,哪有给数组名直接赋值的,都是给数组中的元素赋值。

那是粘贴上去出的问题

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

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

出0入0汤圆

发表于 2013-5-23 15:36:51 | 显示全部楼层
哦,应该是不在同一个C文件中造成的结果;
在另一个C文件中,不明确结构的组成。

出0入0汤圆

 楼主| 发表于 2013-5-23 18:33:45 | 显示全部楼层
lcofjp 发表于 2013-5-23 15:36
哦,应该是不在同一个C文件中造成的结果;
在另一个C文件中,不明确结构的组成。 ...


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


在si4432.h中找不到此类型



解决办法 : 在si4432中定义struct


感谢 lcofjp

出0入0汤圆

发表于 2013-5-23 22:12:50 | 显示全部楼层
也可把struct slaveid[20] 定义留在main.c中,但要在si4432.c中声明extren slaveid[] .

出0入0汤圆

 楼主| 发表于 2013-5-23 22:35:09 | 显示全部楼层
xizi 发表于 2013-5-23 22:12
也可把struct slaveid[20] 定义留在main.c中,但要在si4432.c中声明extren slaveid[] .

那定义struct的类型



struct si4432_revdata
{

        unsigned char rssi;
        union
        {
        float ftem;
        unsigned char tembuff[4];
        } tem[3];
       
        union
        {
        float fvoltage;
        unsigned char voltagebuff[4];
        }voltage[3];
       
} ;

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

求指导




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


而且

struct si4432_revdata
{

        unsigned char rssi;
        union
        {
        float ftem;
        unsigned char tembuff[4];
        } tem[3];
       
        union
        {
        float fvoltage;
        unsigned char voltagebuff[4];
        }voltage[3];
       
} ;

只能放在.h文件中   

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

出0入0汤圆

发表于 2013-5-23 22:48:18 | 显示全部楼层
编译器在使用变量之前是一定要知道变量的类型的,即使用extern声明也还是不知道具体结构体的组成。
因此,结构体的定义必须要出现在si4432.C,可以放在.c中,也可以放在.h中include进来,一般都是放在.h中,然后多个c文件都可以使用这个类型,这样就可以在一个c文件中定义,另一c文件中引用了。

出0入0汤圆

发表于 2013-5-24 10:08:00 | 显示全部楼层
楼上说得对。
定义struct的类型如果放在.c中,则只能该.c文件使用;定义struct的类型放在.h文件中,则可以通过include让多个.c文件使用。哪个.c文件要使用这个struct的类型,哪个.c文件就要include那个.h文件。
具体对楼主的程序,如果把struct slaveid[20] 定义留在main.c中,除了要在si4432.c中声明extren struct si4432_revdata slaveid[] 外,还是要在某个.h文件中定义struct si4432_revdata类型,然后main.c和si4432.c都include这个.h文件。

出0入0汤圆

 楼主| 发表于 2013-5-24 11:25:14 | 显示全部楼层
xizi 发表于 2013-5-24 10:08
楼上说得对。
定义struct的类型如果放在.c中,则只能该.c文件使用;定义struct的类型放在.h文件中,则可以 ...


呵呵

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

我测过过了

灰常感谢大家
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 03:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表