找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4255|回复: 5
打印 上一主题 下一主题
收起左侧

大神看看这个单片机错误如何修改,警告 ‘=’ pointer truncation

[复制链接]
跳转到指定楼层
楼主
ID:218365 发表于 2021-1-13 22:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
unsigned int a;
struct {
    unsigned char d;
    unsigned char e;
}x[3];
main()
{
   a=(unsigned int *)&(x[1].d);
   while(1);     
}

a=(unsigned int *)&(x[1].d); 这一行提示警告 ‘=’ pointer truncation 应该如何修改才不会提示警告

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:429003 发表于 2021-1-14 09:05 | 只看该作者
unsigned int *a;

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:752974 发表于 2021-1-14 10:55 | 只看该作者
代码中的问题是变量的值和变量的地址没有分清,教科书中现成的东西,仔细看看就知道了。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:218365 发表于 2021-1-14 18:19 | 只看该作者

谢谢,这个办法挺好
回复

使用道具 举报

5#
ID:218365 发表于 2021-1-14 20:49 | 只看该作者
munuc_w 发表于 2021-1-14 10:55
代码中的问题是变量的值和变量的地址没有分清,教科书中现成的东西,仔细看看就知道了。

您提醒的对,我改成a= *((unsigned int *)&(x[1].d));就没有错误了。
回复

使用道具 举报

6#
ID:517466 发表于 2021-1-14 22:37 | 只看该作者
建议好好学习取地址与指针方面的知识,以及在51单片机中的应用。你的目的不应该是让程序编译通过,而是搞懂每一个语句、每一个符号的意思。x[3],表示x是数组变量。&x[n]表示数组第n号元素的地址,已经算是指针了。你的程序中,x[1].d是第一号元素的结构体变量中的d变量, &(x[1].d)表示取得第一号元素的结构体变量中的d变量所在的单元地址。 unsigned int a,表示a是一个整数变量,接收整形数据。
你的程序的目的是把数组中某个元素对应的结构体内的两个字符行数据转换为整形数据后,赋值给a。
明白这个目的后,可以使用a= *((unsigned int *)&(x[1].d));也可以使用a=x[1].d*256+x[1].e;获得转换结果。
51系列中保存int型数据时,数据保存在两个单元中。高8位数据放在低地址单元中,低8位数据放在高地址单元。比如258这个数据,转换为16进制数据为0x0102,假设这个数据保存在地址0x0008开始的单元中,那么0x0008单元中保存0x01,0x0009单元中保存0x02。
要注意的是,c语言中,针对不同的处理器,整形所占用的基本存储单元是不一样的。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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