OpenEdv-开源电子网

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

请教指针强制类型转换问题

[复制链接]

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-6-4
在线时间
15 小时
发表于 2016-6-4 15:17:41 | 显示全部楼层 |阅读模式
1金钱
请教各位大神这个错误出在什么地方
QQ截图.png
QQ截图20160604150436.png

最佳答案

查看完整内容[请看2#楼]

找到根本原因啦 犯了个低级错误 我在函数体外部赋值了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-6-4
在线时间
15 小时
 楼主| 发表于 2016-6-4 15:17:42 | 显示全部楼层

找到根本原因啦  犯了个低级错误  我在函数体外部赋值了
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-4 15:35:59 | 显示全部楼层
本帖最后由 憨厚诚实大叔 于 2016-6-4 15:37 编辑

GPIOB是一个指针,而不是结构体,GPIOB->ODR应该是没实际地址的。如果你非要这样操作的话,就把GPIOB->ODR对应操作的实际地址强制转换成指针吧。
我的理解是这样的,你看看GPIOB->ODR取址,编译能通过不。就是简单的
u32 a;
a=&GPIOB->ODR;
你看看这个能通过不
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-6-4
在线时间
15 小时
 楼主| 发表于 2016-6-4 15:53:51 | 显示全部楼层
憨厚诚实大叔 发表于 2016-6-4 15:35
GPIOB是一个指针,而不是结构体,GPIOB->ODR应该是没实际地址的。如果你非要这样操作的话,就把GPIOB->ODR ...

直接操作寄存器控制i/o口电平的时候不也是用的GPIOB->ODR = xxx;吗?  这说明GPIOB->ODR 是有实际地址的   如果像你那样将一个地址赋值给一个变量那类型都不匹配啦
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-4 16:00:10 | 显示全部楼层
本帖最后由 憨厚诚实大叔 于 2016-6-4 16:03 编辑
1142173025 发表于 2016-6-4 15:53
直接操作寄存器控制i/o口电平的时候不也是用的GPIOB->ODR = xxx;吗?  这说明GPIOB->ODR 是有实际地址的   ...

我刚刚看了下,这个是他们的宏定义

#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-4 16:04:59 | 显示全部楼层
GPIOB是一个指针,一个GPIO_TypeDef 类型的指针,不是结构体
u32 a;
a=&GPIOB;你看看这个能通过不,如果不能,说明GPIOB都是没地址的
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-6-4
在线时间
15 小时
 楼主| 发表于 2016-6-4 16:05:11 | 显示全部楼层
憨厚诚实大叔 发表于 2016-6-4 15:35
GPIOB是一个指针,而不是结构体,GPIOB->ODR应该是没实际地址的。如果你非要这样操作的话,就把GPIOB->ODR ...

谢谢啦  我发现在申明指针变量的时候赋值就行啦.   我也不知道为什么!!!  有点奇葩
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-4 16:15:25 | 显示全部楼层
1142173025 发表于 2016-6-4 16:05
谢谢啦  我发现在申明指针变量的时候赋值就行啦.   我也不知道为什么!!!  有点奇葩

你等于是把取址符号去掉吧,没了指针后,等于是指针赋值给指针,肯定是可以的啊,你对一个没地址的东西求址,肯定是错的啊
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-6-4 16:25:28 | 显示全部楼层
代码没任何问题,在我这运行也正常,不知道为什么你的编译器不通过。。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-6-4
在线时间
15 小时
 楼主| 发表于 2016-6-4 16:25:55 | 显示全部楼层
憨厚诚实大叔 发表于 2016-6-4 16:04
GPIOB是一个指针,一个GPIO_TypeDef 类型的指针,不是结构体
u32 a;
a=&GPIOB;你看看这个能通过不,如果 ...

大兄弟  不行!!!  
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-4 16:27:52 | 显示全部楼层
xkwy 发表于 2016-6-4 16:25
代码没任何问题,在我这运行也正常,不知道为什么你的编译器不通过。。

你什么编译器啊,我这边通不过啊
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-6-4 16:30:25 | 显示全部楼层
憨厚诚实大叔 发表于 2016-6-4 16:27
你什么编译器啊,我这边通不过啊

0.png
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-6-4
在线时间
15 小时
 楼主| 发表于 2016-6-4 16:43:37 | 显示全部楼层
xkwy 发表于 2016-6-4 16:25
代码没任何问题,在我这运行也正常,不知道为什么你的编译器不通过。。

找到问题了   我在函数体外部赋值啦   还是非常感谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 06:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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