paulyouravr 发表于 2007-9-21 13:51:24

晚辈真是佩服winavr编译器,4行代码竟然出错。晕倒。

晚辈真是佩服avrstudio编译器,4行代码竟然出错。晕倒。

int flag=0;
int x = 0;
fun()
{
if(flag == 1){
   x++;
}else{
   flag = 1;
}
}

我想让fun()从第二次被调用开始,x自加,可是avrstudio编译器根本不执行x++,晕倒,
优化我设置成-O0,可是还不行。avrstudio不会作编译器就不要作。

rube 发表于 2007-9-21 14:17:59

你这样试试:
volatile unsigned char flag = 0;
volatile unsigned char x = 0;

oldkey 发表于 2007-9-21 15:14:20

你认为有用的东西,别人并不认为也有用!

软件优化的原则,去除无用代码。
。。。

camtime 发表于 2007-9-21 15:29:35

不是winavr的问题,是楼主的代码有问题,鉴定完毕.

smithding 发表于 2007-9-21 23:09:43

我认为楼主的程序在keil中应该是没问题的

ghost2 发表于 2007-9-21 23:56:43

楼主能否贴出全部的代码?
没有main,不知道你是如何调用fun的。
如果只调了一次,那么是你自己的理解有问题

shark 发表于 2007-9-22 00:12:28

我也很佩服楼主,竟然认为 AVR Studio和WinAVR 都是一家出品的.
GCC是有极强优化能力的编译器,如果你的水平不够就不要用了,否则真是自寻烦恼.

ndust 发表于 2007-9-22 06:50:37

按1楼说的做。优化问题。

ywhbn 发表于 2007-9-22 09:02:52

1、你觉得其他那些用GCC、AVRStudio的人都是傻瓜?
2、你觉得自己发现了GCC或者AVRStudio的BUG?
3、你觉得自己这段代码足够“复杂”,暴露了GCC的缺陷,其他人都没碰到过?

如果是1,那你没必要在这里发贴,因为其他人“太傻”,看不懂
如果是2,请你深入分析BUG的原因,然后把过程和结果贴上来让大家分享
如果是3,请你以后不要再用GCC、AVRStudio,因为它们满足不了你的要求

mastiff 发表于 2007-10-6 18:53:43

当某个变量没有被使用时会出现这样的情况的,如果你把X赋给一个寄存器语句就会被执行了,这不是编译器的问题IAR也是如此的

wobue 发表于 2007-10-24 22:42:23

用ICC吧,换一个看看行不行,要是还不行就换IAR。如果都不行,就是你程序的问题了。你的程序太少了,连MAIN都没有。看不明白牙。1楼说的有道理。

gingin 发表于 2007-10-24 22:58:00

很遗憾地告诉楼主,曾有很多怀疑gcc问题的人,但结果都证明是自己代码的问题。
gcc发展到现在,如果那么轻易的就能找到bug,哪个服务器还敢用linux呢。

sufeila 发表于 2007-10-24 23:22:21

加 volatile 就可以.--这个和编译器的规则有关,也和你的C代码风格有关(是否严谨).

foxgrey 发表于 2007-10-25 14:22:57

这个跟加不加volatile没有关系的。

donkey 发表于 2007-10-25 14:26:52

我佩服楼主,无知者无畏

zhwm3064 发表于 2007-10-27 05:48:57

“fun() ”是什么意思?怎么前后都无定义,



if(flag == 1){
   x++;
}else{
   flag = 1;
}
花括号可以省略


“我想让fun()从第二次被调用开始,x自加,可是avrstudio编译器根本不执行x++,晕倒,”??请问第二次还能执行x++吗,你真该晕倒了。

STM32_PLC 发表于 2007-10-27 08:46:59

从优化原则来讲,你的X只是附值,并没有使用,也就是说X的值对于程序没有意义,于是你的X被编译器忽略了。
呵呵,不要认为编译器会很笨。

kaiwenavr 发表于 2007-10-27 09:22:28

无知者无畏

Feeling_MCU 发表于 2007-10-27 11:13:08

int flag=0;
int x = 0;
int main(void)
{
if(flag == 1)
{
   x++;
}
else{
   flag = 1;
}
}

Feeling_MCU 发表于 2007-10-27 11:13:08

int flag=0;
int x = 0;
int main(void)
{
if(flag == 1)
{
   x++;
}
else{
   flag = 1;
}
}

Feeling_MCU 发表于 2007-10-27 11:13:52

int flag=0;
int x = 0;
int main(void)
{
if(flag == 1)
{
   x++;
}
else
{
   flag = 1;
}

}

Feeling_MCU 发表于 2007-10-27 11:15:32

int flag=0;
int x = 0;

int main(void)
{
if(flag == 1)
{
   x++;
}
else
{
   flag = 1;
}
return 0;
}

这样应该没问题

zhwm3064 发表于 2007-10-29 19:19:04

int flag=0;   
int x = 0;
   
int main(void)   
{   
if(flag == 1)
{   
   x++;   
}
else
{   
   flag = 1;   
}
return 0;   
}

这样应该没问题 ?
楼主想让fun()从第二次被调用开始,x自加,可是avrstudio编译器根本不执行x++,
你改成main主函数照样可以第二次被调用,(主函数也可以被调用)
楼主的程序第二次被调用本来就不该执行x++。

channalv 发表于 2007-11-12 18:11:46

果然是晚辈

jj3055 发表于 2007-11-12 18:59:57

哈哈,楼主刚学C语言吧!

paulw 发表于 2008-1-17 11:08:29

优化掉了

zhao_123456 发表于 2008-1-17 12:32:15

哈哈,

rainbow 发表于 2008-1-17 13:14:28

哈。。。楼主都不敢出来。

skyxjh 发表于 2009-10-12 23:11:55

int flag=0;   
int x = 0;
   
void main(void)   
{
while(1)
{
    if(flag == 1)   
      x++;   
    else   
      flag = 1;   
}      
}
这样就行了

isbit 发表于 2009-10-14 22:52:20

程序贴完整看看;

longfeixue 发表于 2009-10-15 11:19:23

我也是新手,虽然不很了解GCC编译器,但我感觉楼主的程序中,fun()函数如果在主程序循环中被连续调用两次以上,肯定应该在第二次以后会执行到 x++;语句呀。除非我感觉16楼和9楼的说的对,GCC编译器的优化规则中默认了这种情况,即因为x只是进行了自加运算,并未未赋值给其他变量,它实际上相当于未被使用,所以被编译器忽略了。其他更了解的,不知道我说的对不?

kebaojun305 发表于 2009-10-15 11:23:10

挖坟帖。

lxx_sea_sky 发表于 2009-10-15 11:38:00

特意试了试,结果发现......-_-!

楼主位的“int flag=0; ”中,此“=”,非彼“=”!
很想知道楼主当真编译过这段代码吗!!!

CoolBird007 发表于 2009-10-15 16:38:31

呵呵,你还别说,我是刚从ICC转过来说GCC的。
这代码从逻辑上来讲是没问题的,这代码在ICC和CV上也确是没问题,问题是GCC不知什么时候会把你的代码和谐掉。所以你为了保险,把所有变量都加上volatile,把优化关掉。呵呵。。。

CoolBird007 发表于 2009-10-15 16:43:19

我也想提个问:
asm("nop");
这样的指令它为什么又不和谐掉呢????

Stitch 发表于 2009-10-15 16:48:20

【32楼】 lxx_sea_sky
特意试了试,结果发现......-_-!

楼主位的“int flag=0; ”中,此“=”,非彼“=”!
很想知道楼主当真编译过这段代码吗!!!
————————————————————
才发现,全角等号………………

ssyniuej 发表于 2009-10-15 18:19:27

真的佩服发现全角等号的朋友,高!还真没注意!

jacobson 发表于 2009-10-15 18:30:02

.

czzhouyun 发表于 2009-10-15 21:25:37

两年前的帖子都给挖出来,晕,人家两年早变成高手了

xy80s 发表于 2012-4-1 09:46:16

好帖子,学习了!

gwnpeter 发表于 2012-4-3 20:15:18

叫兽...........

bygreencn 发表于 2012-4-3 20:23:50

本帖最后由 bygreencn 于 2012-4-3 20:25 编辑

有点拉不出屎赖茅坑的嫌疑,flag 就没有被赋值为1的机会,何来if(flag==1)为true的可能。

wicy001 发表于 2012-4-23 20:10:29

5年前的帖子又被挖出来了。 我原来用Keil的时候也出现这问题,后来才知道是优化级别的问题。

not_at_all 发表于 2012-4-23 22:43:13

这些都是很成熟的编译器,不会犯低级错误,只是你对它不了解。对于一些高级应用,可能需要配置一些参数。 仔细看看手册吧

souching 发表于 2012-7-4 18:17:53

看了半天也没高手出来详细地讲讲被优化掉的原因。
我从keil更换到winavr也连续碰到了几次这种问题,每次都要花费很长时间查找根源。
最终解决方案无非就是将变量加个volatile或将被优化掉的程序段放在一个单独的函数中。
究竟为什么?

sunliezhi 发表于 2012-7-4 19:25:55

x只是在fun()中+1,在别的地方未用到,所以被编译器优化掉了,这是编译器的智能化处理,这种情况不要加volatile,不过加了也没坏处,浪费一个int的空间而已--如果空间有富余的话。

mcu1815 发表于 2012-7-4 19:43:51

楼主估计是新手,刚入门的大学生吧,呵呵,想搞技术,以后碰到这类问题多的是呢。遇到这种问题,99.99%是你自己的问题。
页: [1]
查看完整版本: 晚辈真是佩服winavr编译器,4行代码竟然出错。晕倒。