3749|22

11

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

单片机数据类型问题 [复制链接]

最近做了温度采集程序,因为需要所以现在想将float型温度数据强转成int型
然后在强转的过程中,发现只要tt = temp*0.0625;  这一行代码
强制转换代码就执行不了,出现*** error 65: access violation at C:0xEE00 : no 'execute/read' permission错误
然后将这句代码注释掉就可以随意的强制转换
此帖出自51单片机论坛

最新回复

tt = temp*0.0625; wendu = tt*100;问题应该出在wendu = tt*100上,你wendu定义的是int,而tt是浮点数。  详情 回复 发表于 2016-6-4 01:23
点赞 关注
 

回复
举报

1

帖子

1

TA的资源

一粒金砂(初级)

沙发
 
????????
此帖出自51单片机论坛
 
 
 

回复

6040

帖子

203

TA的资源

版主

板凳
 
什么叫执行不了?是编译错误,链接错误还是运行时错误?
此帖出自51单片机论坛
 
 
 

回复

1798

帖子

0

TA的资源

五彩晶圆(初级)

4
 
没明白你的意思,你的强制转化语句在哪里,对哪个变量转化?
此帖出自51单片机论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

5
 
sint27 发表于 2016-5-18 11:35
没明白你的意思,你的强制转化语句在哪里,对哪个变量转化?

强制转换语句是float ff = 213.12323
int aa;
aa = (int)ff;
用printf("%d",aa)打印
此帖出自51单片机论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

6
 
lcofjp 发表于 2016-5-18 11:32
什么叫执行不了?是编译错误,链接错误还是运行时错误?

实际无法运行,调试的时候出了上面那个错误,
int Get_Tmp(uchar d)                   //获取温度get the temperature
{
uchar a,b;
float tt;
uint temp;
int wendu;
Init_Ds18b20();                //初始化
Write_One_Byte(0xcc);          //忽略ROM指令
Init_Ds18b20();
b20_Matchrom(d);                 //匹配ROM d
Write_One_Byte(0x44);          //温度转换指令
Init_Ds18b20();                 //初始化
Write_One_Byte(0xcc);          //忽略ROM指令
Init_Ds18b20();
b20_Matchrom(d);                 //匹配ROM d
Write_One_Byte(0xbe);          //读暂存器指令
a = Read_One_Byte();           //读取到的第一个字节为温度LSB
b = Read_One_Byte();           //读取到的第一个字节为温度MSB
temp = b;                      //先把高八位有效数据赋于temp
temp <<= 8;                    //把以上8位数据从temp低八位移到高八位
temp = temp|a;                //两字节合成一个整型变量
tt = temp*0.0625;              //得到真实十进制温度值
wendu = tt*100;
return temp;
}
此帖出自51单片机论坛

点评

tt = temp*0.0625; 楼主这个地方,如果报错你解决不了,还有种方法。你不用强制类型转换,可以考虑tt就是float型的。然后到时候把结果乘以1000放大,然后要看你是数码管显示还是液晶屏显示了,如果是数码管显示,这  详情 回复 发表于 2016-5-18 16:44
 
 
 

回复

6040

帖子

203

TA的资源

版主

7
 
这应该不是数据类型的问题,是不是你的Flash空间不够了?代码多大,Flash空间多大?
此帖出自51单片机论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

8
 
lcofjp 发表于 2016-5-18 11:43
这应该不是数据类型的问题,是不是你的Flash空间不够了?代码多大,Flash空间多大?

Program Size: data=15.1 xdata=60 code=3761    看这个吗  52单片机的  
此帖出自51单片机论坛

点评

是有这句话的编译结果吗? tt = temp*0.0625; //得到真实十进制温度值  详情 回复 发表于 2016-5-18 11:50
 
 
 

回复

6040

帖子

203

TA的资源

版主

9
 
星空下的吖米 发表于 2016-5-18 11:47
Program Size: data=15.1 xdata=60 code=3761    看这个吗  52单片机的

是有这句话的编译结果吗?   tt = temp*0.0625;              //得到真实十进制温度值
此帖出自51单片机论坛
 
 
 

回复

6040

帖子

203

TA的资源

版主

10
 
再说这个错误提示是以什么方式提示出来的?52单片机可以仿真吗?
此帖出自51单片机论坛

点评

对了,调试的时候显示是在printf那句话的时候跑飞,可是没有那句tt = temp*0.0625;代码的时候就可以正常执行  详情 回复 发表于 2016-5-18 11:58
可以Debug,上面那个程序已经涉及到强制类型转换了, 可是只要把int型改成返回float型就没问题了·····  详情 回复 发表于 2016-5-18 11:56
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

11
 
lcofjp 发表于 2016-5-18 11:51
再说这个错误提示是以什么方式提示出来的?52单片机可以仿真吗?

可以Debug,上面那个程序已经涉及到强制类型转换了, 可是只要把int型改成返回float型就没问题了·····
此帖出自51单片机论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

12
 
lcofjp 发表于 2016-5-18 11:51
再说这个错误提示是以什么方式提示出来的?52单片机可以仿真吗?

对了,调试的时候显示是在printf那句话的时候跑飞,可是没有那句tt = temp*0.0625;代码的时候就可以正常执行
此帖出自51单片机论坛

点评

是不是printf的问题,难道你的printf不支持浮点数?  详情 回复 发表于 2016-5-18 12:11
 
 
 

回复

6040

帖子

203

TA的资源

版主

13
 
星空下的吖米 发表于 2016-5-18 11:58
对了,调试的时候显示是在printf那句话的时候跑飞,可是没有那句tt = temp*0.0625;代码的时候就可以正常 ...

是不是printf的问题,难道你的printf不支持浮点数?
此帖出自51单片机论坛

点评

浮点的时候可以打印,然后强转成int的时候就不行了  详情 回复 发表于 2016-5-18 12:20
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

14
 
lcofjp 发表于 2016-5-18 12:11
是不是printf的问题,难道你的printf不支持浮点数?

  浮点的时候可以打印,然后强转成int的时候就不行了
此帖出自51单片机论坛

点评

最好把出问题的程序全部都贴出来。现在也看不到printf函数,而且你的函数里虽然用到了浮点数,但是完全没返回。wendu = tt*100这里要加个强制类型转化吧  详情 回复 发表于 2016-5-18 12:29
 
 
 

回复

6040

帖子

203

TA的资源

版主

15
 
星空下的吖米 发表于 2016-5-18 12:20
浮点的时候可以打印,然后强转成int的时候就不行了

最好把出问题的程序全部都贴出来。现在也看不到printf函数,而且你的函数里虽然用到了浮点数,但是完全没返回。wendu = tt*100这里要加个强制类型转化吧
此帖出自51单片机论坛

点评

请问你那有Keil4吗 可以加你QQ把代码发给你吗 很奇怪 只是一句代码就搞到强制转换不了  详情 回复 发表于 2016-5-18 12:47
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

16
 
lcofjp 发表于 2016-5-18 12:29
最好把出问题的程序全部都贴出来。现在也看不到printf函数,而且你的函数里虽然用到了浮点数,但是完全没 ...

请问你那有Keil4吗   可以加你QQ把代码发给你吗  很奇怪  只是一句代码就搞到强制转换不了
此帖出自51单片机论坛

点评

目前看就是哪里有异常就从哪里入手,既然异常了,肯定是有变量或者代码超出正常地址范围了。要找关键点。我电脑并没安装keil。  详情 回复 发表于 2016-5-18 12:56
 
 
 

回复

6040

帖子

203

TA的资源

版主

17
 
星空下的吖米 发表于 2016-5-18 12:47
请问你那有Keil4吗   可以加你QQ把代码发给你吗  很奇怪  只是一句代码就搞到强制转换不了

目前看就是哪里有异常就从哪里入手,既然异常了,肯定是有变量或者代码超出正常地址范围了。要找关键点。我电脑并没安装keil。
此帖出自51单片机论坛

点评

好的,谢谢你,我试试看  详情 回复 发表于 2016-5-18 13:28
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

18
 
lcofjp 发表于 2016-5-18 12:56
目前看就是哪里有异常就从哪里入手,既然异常了,肯定是有变量或者代码超出正常地址范围了。要找关键点。 ...

好的,谢谢你,我试试看
此帖出自51单片机论坛
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

19
 
星空下的吖米 发表于 2016-5-18 11:40
实际无法运行,调试的时候出了上面那个错误,
int Get_Tmp(uchar d)                   //获取温度get t ...

tt = temp*0.0625;
楼主这个地方,如果报错你解决不了,还有种方法。你不用强制类型转换,可以考虑tt就是float型的。然后到时候把结果乘以1000放大,然后要看你是数码管显示还是液晶屏显示了,如果是数码管显示,这个数字(刚才乘以1000后得到的数字),就要求其整数部分和小数部分了。
还有,论坛里有相应的帖子,楼主也可以参考哦。
此帖出自51单片机论坛

点评

取整其实还是得强制转换  详情 回复 发表于 2016-5-18 17:08
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

20
 
已经解决了,谢谢各位的帮助,我的解决方法是在那处有问题的代码
tt = temp*0.0625      //这处0.0625改成除以16就行了   为何会这样可能是不同数据结构运算出错了
然而我看别人的程序了也是直接乘以0.0625是没问题的   所以也不知道是为什么
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表