[STM8] 请大家帮忙看看这种结构体指针定义使用有什么问题

[复制链接]
5889|38
 楼主| wqz 发表于 2013-12-6 15:51 | 显示全部楼层 |阅读模式
代码如下:
struct stuTest{
   unsigned char  stu1[10];
   unsigned char  stu2[11];       
   unsigned char  stu3[5];
   unsigned char  stu4[5];
};   
struct stuTest Testl;
struct stuTest *pStu;
pStu=&Testl;

在IAR for STM8 上编译,无法通过。请大家帮忙看看问题出在那里?

Error[Pe077]: this declaration has no storage class or type specifier
Error[Pe147]: declaration is incompatible with "struct stuTest *__near pStu" (declared at line 66)
Error[Pe144]: a value of type "struct stuTest *" cannot be used to initialize an entity of type "int"
 楼主| wqz 发表于 2013-12-6 16:05 | 显示全部楼层
从网络上搜个代码拷贝进去,也是出现同样的错误:
struct student
{
        char name[20];
        int num;
};
struct student stu1,stu2;
struct student *p;
p=&stu1;
feilusia 发表于 2013-12-6 16:21 | 显示全部楼层
这两句
struct stuTest *pStu;
pStu=&Testl;

改成
struct stuTest *pStu = (stuTest *)Testl ;

试试
feilusia 发表于 2013-12-6 16:22 | 显示全部楼层
另外这些定义的语句不能放在头文件,必须要放在.c的文件里。如果头文件要声明,需要加extern.
 楼主| wqz 发表于 2013-12-6 16:40 | 显示全部楼层
将代码放到main.c里,并修改了,还是不行。
feilusia 发表于 2013-12-6 17:09 | 显示全部楼层
wqz 发表于 2013-12-6 16:40
将代码放到main.c里,并修改了,还是不行。

先写一个定义结构体的、把定义结构体指针的先注释掉,编译下能不能过。
 楼主| wqz 发表于 2013-12-6 17:13 | 显示全部楼层
按下面那样就可以通过编译:
struct stuTest{
   unsigned char  stu1[10];
   unsigned char  stu2[11];       
   unsigned char  stu3[5];
   unsigned char  stu4[5];
};   
struct stuTest Testl;
struct stuTest * pStu;
feilusia 发表于 2013-12-6 17:16 | 显示全部楼层
wqz 发表于 2013-12-6 17:13
按下面那样就可以通过编译:
struct stuTest{
   unsigned char  stu1[10];

把最后一句改成struct stuTest *pStu = (struct stuTest *)Testl ;试试
kenmy 发表于 2013-12-6 17:18 | 显示全部楼层
你用一个typedef 重命名结构体,然后你给该类型的结构体变量定义类型就直接用重命名的名字就好了,而不用跟着struct,如下修改参考
typedef struct {
   unsigned char  stu1[10];
   unsigned char  stu2[11];        
   unsigned char  stu3[5];
   unsigned char  stu4[5];
}stuTest;
stuTest Testl;
stuTest *pStu;
pStu=&Testl;

评分

参与人数 1威望 +4 收起 理由
fzy_666 + 4 赞一个! 我也是这么干的!

查看全部评分

ar_m_cu 发表于 2013-12-6 17:20 | 显示全部楼层
本帖最后由 ar_m_cu 于 2013-12-6 17:22 编辑

我用keil编译没问题啊,在IAR for ARM中编译也没有问题
 楼主| wqz 发表于 2013-12-6 17:20 | 显示全部楼层
feilusia 发表于 2013-12-6 17:16
把最后一句改成struct stuTest *pStu = (struct stuTest *)Testl ;试试

这种试过不行的

评论

struct stuTest *pStu = (struct stuTest *)Testl ---------------------- 这句肯定是错的,漏了个求地址的操作符'&'  发表于 2013-12-7 06:49
 楼主| wqz 发表于 2013-12-6 17:21 | 显示全部楼层
kenmy 发表于 2013-12-6 17:18
你用一个typedef 重命名结构体,然后你给该类型的结构体变量定义类型就直接用重命名的名字就好了,而不用跟 ...

一样的错误提醒
 楼主| wqz 发表于 2013-12-6 17:23 | 显示全部楼层
我在IAR for STM8 上进行编译无法通过,朋友们也可以试试看是否可以!
 楼主| wqz 发表于 2013-12-6 17:24 | 显示全部楼层
版本是:IAR Embedded Workbench for STMicroelectronics STM8 1.31
 楼主| wqz 发表于 2013-12-6 17:26 | 显示全部楼层
反复的看,好像语句并没有什么问题,是否编译器需要做设置?
huanben 发表于 2013-12-6 18:09 | 显示全部楼层
struct stuTest Testl;
struct stuTest *pStu;
指针pStu和对象Testl是不同的类型,虽然同时使用struct stuTest声明。C与指针这本书里有说明。

:lol好久没写代码,上述论断仅作参考,以书本为准。
puchuang 发表于 2013-12-6 18:25 | 显示全部楼层
没有怎么接触过这一块   楼主   帮你顶一个吧   自己钻研钻   应该能出来吧
 楼主| wqz 发表于 2013-12-6 22:02 | 显示全部楼层
huanben 发表于 2013-12-6 18:09
struct stuTest Testl;
struct stuTest *pStu;
指针pStu和对象Testl是不同的类型,虽然同时使用struct stuTe ...

结构体.JPG
《C和指针》的196页确实有类似描述,但指的是两个匿名的结构体。
huanben 发表于 2013-12-6 22:14 | 显示全部楼层
wqz 发表于 2013-12-6 22:02
《C和指针》的196页确实有类似描述,但指的是两个匿名的结构体。

书本有从文字上声明:只有匿名结构体才会这样吗?
sfesdm 发表于 2013-12-6 22:37 | 显示全部楼层
MDK下编译没问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

wqz

12

主题

117

帖子

2

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