21ic电子技术开发论坛 单片机与嵌入式系统 Microchip 奇怪的常数数组错误(H-ITECH V9.82)
发新帖我要提问
12
返回列表
打印

奇怪的常数数组错误(H-ITECH V9.82)

[复制链接]
楼主: 与时俱进
手机看帖
扫描二维码
随时随地手机跟帖
21
与时俱进|  楼主 | 2012-10-17 10:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
那就很晕了。难道随着代码不同,编译可能出错、也可能正确?
我试过用s[char c]方式访问数组就不会有问题。
算了,不纠结了,不影响项目,只是好奇。
再次感谢 yewuyi

使用特权

评论回复
22
yewuyi| | 2012-10-17 13:58 | 只看该作者
那就很晕了。难道随着代码不同,编译可能出错、也可能正确?
我试过用s[char c]方式访问数组就不会有问题。
算了,不纠结了,不影响项目,只是好奇。
再次感谢 yewuyi ...
与时俱进 发表于 2012-10-17 10:45



可能在编译器的整型变量时使用了这个优化规则。
你把程序改为如下:
void                 main(void)
{
i=s[63];   //这条执行完,i=0x3f是对的
j=s[i+1];  //这条执行完,j=0,错了!
LATA=i;
LATC=j;
asm("nop");
}
编译后SIM运行看结果,则可发现得到了正确的结果。
通过我的各种测试,可发现,这基本上就是优化规则导致的一个结果,优化规则发现你原来的那一段代码,不管是j=s[64];还是后面的 LATC=j;都是没有实际作用的代码,于是优化规则‘自作主张’将它执行了优化,导致了和我们一般理解上出现了偏差。
而我在本帖中修改后的代码j=s[i+1];  则成功的骗过了优化规则(再次证明了再高明的优化规则还是没有人聪明啊,我简单的一改就骗过了它),更改后的代码骗过了优化规则,于是得到了我们一般理解上认为是正确的代码。

这也不算是啥纠结,有这种好奇的心理去把问题弄个彻底性明白是好事情。
通过当前的各种测试结果来看,也谈不上是什么BUG,可算是优化规则未充分考虑到人的一般理解吧。



}

使用特权

评论回复
23
与时俱进|  楼主 | 2012-10-17 16:53 | 只看该作者
还是**我的观点,编译器存在bug。
楼上把语句改成j=s[i+1]; 所以运行正确,这个我验证了,也在21楼说过了。

使用特权

评论回复
24
与时俱进|  楼主 | 2012-10-17 17:47 | 只看该作者
22# yewuyi 或者这样,把22楼程序里的63改成64试试结果如何?

使用特权

评论回复
25
yewuyi| | 2012-10-18 08:32 | 只看该作者
还是**我的观点,编译器存在bug。
楼上把语句改成j=s; 所以运行正确,这个我验证了,也在21楼说过了。
与时俱进 发表于 2012-10-17 16:53


我就不再一一验证了,你可以将这个问题发给MICROCHIP寻求官方解决。

使用特权

评论回复
26
与时俱进|  楼主 | 2012-10-18 08:41 | 只看该作者
本帖最后由 与时俱进 于 2012-10-18 08:58 编辑

谢谢!上个图。

const_int_test_err.JPG (33.95 KB )

const_int_test_err.JPG

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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