晚辈真是佩服winavr编译器,4行代码竟然出错。晕倒。
晚辈真是佩服avrstudio编译器,4行代码竟然出错。晕倒。int flag=0;
int x = 0;
fun()
{
if(flag == 1){
x++;
}else{
flag = 1;
}
}
我想让fun()从第二次被调用开始,x自加,可是avrstudio编译器根本不执行x++,晕倒,
优化我设置成-O0,可是还不行。avrstudio不会作编译器就不要作。 你这样试试:
volatile unsigned char flag = 0;
volatile unsigned char x = 0; 你认为有用的东西,别人并不认为也有用!
软件优化的原则,去除无用代码。
。。。 不是winavr的问题,是楼主的代码有问题,鉴定完毕. 我认为楼主的程序在keil中应该是没问题的 楼主能否贴出全部的代码?
没有main,不知道你是如何调用fun的。
如果只调了一次,那么是你自己的理解有问题 我也很佩服楼主,竟然认为 AVR Studio和WinAVR 都是一家出品的.
GCC是有极强优化能力的编译器,如果你的水平不够就不要用了,否则真是自寻烦恼. 按1楼说的做。优化问题。 1、你觉得其他那些用GCC、AVRStudio的人都是傻瓜?
2、你觉得自己发现了GCC或者AVRStudio的BUG?
3、你觉得自己这段代码足够“复杂”,暴露了GCC的缺陷,其他人都没碰到过?
如果是1,那你没必要在这里发贴,因为其他人“太傻”,看不懂
如果是2,请你深入分析BUG的原因,然后把过程和结果贴上来让大家分享
如果是3,请你以后不要再用GCC、AVRStudio,因为它们满足不了你的要求 当某个变量没有被使用时会出现这样的情况的,如果你把X赋给一个寄存器语句就会被执行了,这不是编译器的问题IAR也是如此的 用ICC吧,换一个看看行不行,要是还不行就换IAR。如果都不行,就是你程序的问题了。你的程序太少了,连MAIN都没有。看不明白牙。1楼说的有道理。 很遗憾地告诉楼主,曾有很多怀疑gcc问题的人,但结果都证明是自己代码的问题。
gcc发展到现在,如果那么轻易的就能找到bug,哪个服务器还敢用linux呢。 加 volatile 就可以.--这个和编译器的规则有关,也和你的C代码风格有关(是否严谨). 这个跟加不加volatile没有关系的。 我佩服楼主,无知者无畏 “fun() ”是什么意思?怎么前后都无定义,
if(flag == 1){
x++;
}else{
flag = 1;
}
花括号可以省略
“我想让fun()从第二次被调用开始,x自加,可是avrstudio编译器根本不执行x++,晕倒,”??请问第二次还能执行x++吗,你真该晕倒了。 从优化原则来讲,你的X只是附值,并没有使用,也就是说X的值对于程序没有意义,于是你的X被编译器忽略了。
呵呵,不要认为编译器会很笨。 无知者无畏 int flag=0;
int x = 0;
int main(void)
{
if(flag == 1)
{
x++;
}
else{
flag = 1;
}
} int flag=0;
int x = 0;
int main(void)
{
if(flag == 1)
{
x++;
}
else{
flag = 1;
}
} int flag=0;
int x = 0;
int main(void)
{
if(flag == 1)
{
x++;
}
else
{
flag = 1;
}
} int flag=0;
int x = 0;
int main(void)
{
if(flag == 1)
{
x++;
}
else
{
flag = 1;
}
return 0;
}
这样应该没问题 int flag=0;
int x = 0;
int main(void)
{
if(flag == 1)
{
x++;
}
else
{
flag = 1;
}
return 0;
}
这样应该没问题 ?
楼主想让fun()从第二次被调用开始,x自加,可是avrstudio编译器根本不执行x++,
你改成main主函数照样可以第二次被调用,(主函数也可以被调用)
楼主的程序第二次被调用本来就不该执行x++。 果然是晚辈 哈哈,楼主刚学C语言吧! 优化掉了 哈哈, 哈。。。楼主都不敢出来。 int flag=0;
int x = 0;
void main(void)
{
while(1)
{
if(flag == 1)
x++;
else
flag = 1;
}
}
这样就行了 程序贴完整看看; 我也是新手,虽然不很了解GCC编译器,但我感觉楼主的程序中,fun()函数如果在主程序循环中被连续调用两次以上,肯定应该在第二次以后会执行到 x++;语句呀。除非我感觉16楼和9楼的说的对,GCC编译器的优化规则中默认了这种情况,即因为x只是进行了自加运算,并未未赋值给其他变量,它实际上相当于未被使用,所以被编译器忽略了。其他更了解的,不知道我说的对不? 挖坟帖。 特意试了试,结果发现......-_-!
楼主位的“int flag=0; ”中,此“=”,非彼“=”!
很想知道楼主当真编译过这段代码吗!!! 呵呵,你还别说,我是刚从ICC转过来说GCC的。
这代码从逻辑上来讲是没问题的,这代码在ICC和CV上也确是没问题,问题是GCC不知什么时候会把你的代码和谐掉。所以你为了保险,把所有变量都加上volatile,把优化关掉。呵呵。。。 我也想提个问:
asm("nop");
这样的指令它为什么又不和谐掉呢???? 【32楼】 lxx_sea_sky
特意试了试,结果发现......-_-!
楼主位的“int flag=0; ”中,此“=”,非彼“=”!
很想知道楼主当真编译过这段代码吗!!!
————————————————————
才发现,全角等号……………… 真的佩服发现全角等号的朋友,高!还真没注意! . 两年前的帖子都给挖出来,晕,人家两年早变成高手了 好帖子,学习了! 叫兽........... 本帖最后由 bygreencn 于 2012-4-3 20:25 编辑
有点拉不出屎赖茅坑的嫌疑,flag 就没有被赋值为1的机会,何来if(flag==1)为true的可能。 5年前的帖子又被挖出来了。 我原来用Keil的时候也出现这问题,后来才知道是优化级别的问题。 这些都是很成熟的编译器,不会犯低级错误,只是你对它不了解。对于一些高级应用,可能需要配置一些参数。 仔细看看手册吧 看了半天也没高手出来详细地讲讲被优化掉的原因。
我从keil更换到winavr也连续碰到了几次这种问题,每次都要花费很长时间查找根源。
最终解决方案无非就是将变量加个volatile或将被优化掉的程序段放在一个单独的函数中。
究竟为什么? x只是在fun()中+1,在别的地方未用到,所以被编译器优化掉了,这是编译器的智能化处理,这种情况不要加volatile,不过加了也没坏处,浪费一个int的空间而已--如果空间有富余的话。 楼主估计是新手,刚入门的大学生吧,呵呵,想搞技术,以后碰到这类问题多的是呢。遇到这种问题,99.99%是你自己的问题。
页:
[1]