那就很晕了。难道随着代码不同,编译可能出错、也可能正确?
我试过用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,可算是优化规则未充分考虑到人的一般理解吧。
} |