OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5024|回复: 22

Keil中有意思的结构体强制类型转换,大家讨论一下

[复制链接]

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
发表于 2016-11-7 14:02:30 | 显示全部楼层 |阅读模式
如题,今天在keil上写一个小程序,定义了一个结构体来记录数据,没有在定义的地方赋初值,然后在需要的地方把这几个值赋给结构体,做了一个强制类型转换。结构我再程序里面做了一个类似下面test = (datatype){ 1,2,'c' };的操作,keil提示不能进行转换。
于是我在vs2015下测试了一下,结果没有问题,也没有警告。


#include "stdio.h"
typedef struct {
        int a;
        int b;
        char c;
}datatype;
int main()
{
        datatype test;
        test = (datatype){ 1,2,'c' };
        printf("%d %d %c", test.a, test.b, test.c);
        return 0;
}



于是我就怀疑是不是IDE支持而C99或者ASCI不支持呢,接着我就打开了UBUNTU虚拟机,把这段代码在vi里面敲下来,gcc编译打开所有警告,并且分别用C99和ASIC标准编译,结果都没有问题。

大家说一说,这是什么问题,是因为KEIL不完全符合标准吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-11-7 14:05:44 | 显示全部楼层
keil有些离奇的,我现在用IAR了,楼主可以用IAR试试
回复 支持 反对

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2016-11-7 14:10:19 | 显示全部楼层
编译器原因吧~
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2016-11-7 14:10:39 | 显示全部楼层
八度空间 发表于 2016-11-7 14:05
keil有些离奇的,我现在用IAR了,楼主可以用IAR试试

谢谢版主回答,以前用IAR,现在公司要求用keil没办法。只是对这个标准都明确支持的语法keil都不支持,我也是醉了,想想都觉得不可思议,太坑了。
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2016-11-7 14:13:49 | 显示全部楼层

目前来看应该是,我再ubuntu下gcc编译完全没问题,想不到keil竟然这么弱。
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2016-11-7 14:14:38 | 显示全部楼层
八度空间 发表于 2016-11-7 14:05
keil有些离奇的,我现在用IAR了,楼主可以用IAR试试

对了,IAR这么做你试了可以吗,我这没环境
回复 支持 反对

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2016-11-7 14:16:48 | 显示全部楼层
teczm 发表于 2016-11-7 14:13
目前来看应该是,我再ubuntu下gcc编译完全没问题,想不到keil竟然这么弱。

keil其他不知道,编译优化确实比起iar要弱些~
回复 支持 反对

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-11-7 14:34:18 | 显示全部楼层
IAR和KEIL都测试过了,在KEIL下编译错误、IAR没问题。
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2016-11-7 17:01:54 | 显示全部楼层
shuaigew88 发表于 2016-11-7 14:34
IAR和KEIL都测试过了,在KEIL下编译错误、IAR没问题。

谢谢,看来真是keil的问题了。刚才猜测我这个版本的keil只支持c89,于是又gcc一遍,结果依然没问题,keil太蛋疼了。
回复 支持 反对

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-11-7 17:06:08 | 显示全部楼层
teczm 发表于 2016-11-7 17:01
谢谢,看来真是keil的问题了。刚才猜测我这个版本的keil只支持c89,于是又gcc一遍,结果依然没问题,keil ...

是的,KEIL不仅是这里有问题还有很多地方支持不好。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-11-7 21:02:02 | 显示全部楼层
shuaigew88 发表于 2016-11-7 14:34
IAR和KEIL都测试过了,在KEIL下编译错误、IAR没问题。

好神速啊,测试及时,今天忙飞了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-11-7 21:02:24 | 显示全部楼层
teczm 发表于 2016-11-7 14:14
对了,IAR这么做你试了可以吗,我这没环境

今天忙飞了,没时间测试,不好意思啊
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-11-8 09:19:59 | 显示全部楼层
八度空间 发表于 2016-11-7 21:02
好神速啊,测试及时,今天忙飞了

因为我KEIL和IAR都在用,所以就方便测试了一下。

回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2016-11-8 11:01:18 | 显示全部楼层
八度空间 发表于 2016-11-7 21:02
今天忙飞了,没时间测试,不好意思啊

没事,我就问问,想知道一下结果
回复 支持 反对

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-11-8 13:28:46 | 显示全部楼层
我在KEIL 5.20下编译没问题,能通过。C99模式开和不开都试过,没问题。
活到老,学到老。
回复 支持 反对

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-11-8 13:36:58 | 显示全部楼层
我试了下,打开c99可以,不打开不行。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-11-8 16:52:49 | 显示全部楼层
shuaigew88 发表于 2016-11-8 09:19
因为我KEIL和IAR都在用,所以就方便测试了一下。

我也是两个一起用的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-11-8 16:52:58 | 显示全部楼层
teczm 发表于 2016-11-8 11:01
没事,我就问问,想知道一下结果

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-11-8 18:13:57 | 显示全部楼层
八度空间 发表于 2016-11-8 16:52
我也是两个一起用的

IAR工程支持多级文件夹方便管理,KEIL使用时对ST-LINK支持感觉比IAR好太多了,所以一起用
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2016-11-8 19:20:35 | 显示全部楼层
ysq7120 发表于 2016-11-8 13:36
我试了下,打开c99可以,不打开不行。

应该还是编译器的问题,我在linux下gcc -c89都没问题,所以可能只是单纯的编译器没有做到支持
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2016-11-8 19:25:11 | 显示全部楼层
kingnike 发表于 2016-11-8 13:28
我在KEIL 5.20下编译没问题,能通过。C99模式开和不开都试过,没问题。

都用5.20了,我还是4.23,哎,什么时候我们也能用上高版本
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2016-11-8 19:35:33 | 显示全部楼层

其实我还有一个有意思的问题,不过懒得发帖了,可以分享出来一起讨论一下。
在启动文件中,我没有用keil提供的__main函数,自己写了个DMA搬移的程序,将RW ZI RO搬移到RAM里,以前都是从image$$region$$RO$$limit(region名字就不用管了)来取源数据,但是前段时间发现一个问题,有时候image$$region$$RO$$limit的地址会和load$$region$$RO$$limit的地址差两个字节,而且复现时每次都是差两个字节。
找了很多资料也没找到一个说法,谷歌到一个文件,但是人家只是说了这两个地址并不总是相等,但是没说什么时候为什么不相等,我怀疑是ARM指令集和THMUB指令集的原因导致的,但是不确定。不知道你有没有什么想法。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-11-9 12:34:39 | 显示全部楼层
teczm 发表于 2016-11-8 19:35
其实我还有一个有意思的问题,不过懒得发帖了,可以分享出来一起讨论一下。
在启动文件中,我没有用keil ...

那你要找找指令集相关资料了,不好说,keil有点奇葩的,反汇编看,同样的语句汇编都不一样的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 21:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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