单片机程序小问题

fan   2009-7-8 19:54 楼主
不知道怎么编译有问题,就是箭头那儿,如果我把uchar i,j;放到while循环外面就能够通过编译,这是为什么,怎么这么奇怪,高手解释一下,我刚学单片机!
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar temp,ftemp;
void delay(uint );
void main()
{
        while(1)
        {
                temp=0xff;
                uchar i,j;——————————————————————————>就是这儿
                for(i=0;i<=7;i++)
                {       
                        temp=temp-pow(2,i);
                        P1=temp;
                        ftemp=temp;
                        for(j=0;j<=7-i;j++)
                        {       
                                delay(500);
                                ftemp=_crol_(ftemp,1);
                                P1=ftemp;
                        }
                        P1=0xff;
                        delay(500);
                }       
        }
}
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=144;y>0;y--);
}

回复评论 (30)

高手帮忙
点赞  2009-7-8 19:56
这论坛太冷了吧!
点赞  2009-7-8 20:43
变量需要在函数的开头定义。
点赞  2009-7-8 20:45
引用: 引用 3 楼 zyzhang365 的回复:
变量需要在函数的开头定义。

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=144;y>0;y--);
}
那么我这个函数怎么没有问题,为什么变量要在函数开头定义,C中没有这样的规定!
点赞  2009-7-8 21:04
你这个也是在函数的开始定义的啊, 也就是说在所有语句之前定义。 嵌入式C好像都是这样。
点赞  2009-7-8 21:12
uchar temp,ftemp;
void delay(uint );
void main()
{
uchar i,j;//  放到这里。
while(1)
{
temp=0xff;
for(i=0;i <=7;i++)
{
temp=temp-pow(2,i);
P1=temp;
ftemp=temp;
for(j=0;j <=7-i;j++)
{
delay(500);
ftemp=_crol_(ftemp,1);
P1=ftemp;
}
P1=0xff;
delay(500);
}
}
}
点赞  2009-7-8 21:13
C不像C++。变量在C里要定义在语句前,C++是随用随定义。使用在C中变量会出现没初始化的情况。
点赞  2009-7-8 21:31
变量的再函数的前面声明的1
点赞  2009-7-8 21:43
因为你把变量定义在循环语句里,相当于每循环一次就重复定义一次变量,当然会发生变量重复定义的错误。
不能编译是肯定的,之所以把变量定义在头部没问题是因为变量只执行了一次定义,没有被重复定义。
这个不是单片机的什么语言特殊问题,而是基本的语言使用问题,无论是C、C++、VB、VC、Delphi...等语言
如果你把定义变量的语句放到循环语句中,基本上都会出这样的问题,除非那个循环语句只循环一次,不然肯定
会出错。
点赞  2009-7-9 04:24
上边都说了,按照做吧
点赞  2009-7-9 08:12
说的很明白了,呵呵,放到函数的开头去。
点赞  2009-7-9 09:12
9楼分析得很详细
点赞  2009-7-9 10:30
其实只是编译器的设定问题,同样是c语言,比如用gcc编译器,变量定义是允许不放在函数开头的

另外c#和java都允许将变量定义放在循环体内而不会出现重复定义的错误
比如c#里:

  1. while(1)
  2. {
  3.    int i;
  4.    i++;
  5. }

这样是没有任何问题的,但i的作用域也会被限定在while这个循环体内,出了循环体i就被释放了,也就是在while循环体外不能再使用i这个变量。

所以说到底还是编译器的特性决定的
点赞  2009-7-9 13:05
引用: 引用 4 楼 iwaich 的回复:
引用 3 楼 zyzhang365 的回复:
变量需要在函数的开头定义。

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=144;y>0;y--);
}
那么我这个函数怎么没有问题,为什么变量要在函数开头定义,C中没有这样的规定!


C99中没这么规定么?

正如打开头就抽假烟的人,抽一次真烟,会认为真烟是假的.
点赞  2009-7-9 15:25
这是什么毛病啊/
点赞  2009-7-9 19:34
引用: 引用 13 楼 skylkj 的回复:
其实只是编译器的设定问题,同样是c语言,比如用gcc编译器,变量定义是允许不放在函数开头的
  
另外c#和java都允许将变量定义放在循环体内而不会出现重复定义的错误
比如c#里:
C# code
while(1)
{
   int i;
   i++;
}


这样是没有任何问题的,但i的作用域也会被限定在while这个循环体内,出了循环体i就被释放了,也就是在while循环体外不能再使用i这个变量。
  
所以说到底还是编译器的特性决定的


不是编译器决定的,而是语言决定的。
C变量定义要在函数开始的地方,C++则没有这个限制
点赞  2009-7-10 01:59
老标准的C要求变量的定义必须放在可执行语句前面
点赞  2009-7-10 07:46
同样的c代码,使用gcc编译器,变量申明是不需要放在函数开头的。

其实编译器也就是一个程序,最简单的例子,如果编译器是我做的,我在编译之前将代码当成文本处理,然后把所有出现在函数体中的变量声明都自动放到函数开头,然后再调用原本的编译程序,这样不就可以了吗?


所以最终决定这种特性的是编译器,而不是语言。
所谓的“C语言要求变量的定义必须放在可执行语句前面”,并不是因为语言本身有这种需求,而是当时的编译器就是这么设计的。
点赞  2009-7-10 08:27
引用: 引用 18 楼 skylkj 的回复:
同样的c代码,使用gcc编译器,变量申明是不需要放在函数开头的。
  
其实编译器也就是一个程序,最简单的例子,如果编译器是我做的,我在编译之前将代码当成文本处理,然后把所有出现在函数体中的变量声明都自动放到函数开头,然后再调用原本的编译程序,这样不就可以了吗?
  
  
所以最终决定这种特性的是编译器,而不是语言。
所谓的“C语言要求变量的定义必须放在可执行语句前面”,并不是因为语言本身有这种需求,而是…


呵呵,太深究了,知道怎么回事儿就行了
点赞  2009-7-10 09:45
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复