打印

C语言问题

[复制链接]
3743|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hbjl_pzg|  楼主 | 2008-5-8 20:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
正在学C51,有一些问题想请教:
1、为什么在主程序内使用sbit关键字会报错?
2、为什么在主程序外对IO口如P1赋值就会报错,提示是重复定义。但是在主程序内就没有问题?
3、为什么有的函数在主程序外声明,有的却在主程序内声明。有时函数在主程序外声明没有问题,但在主程序内声明就报错?

相关帖子

沙发
NE5532| | 2008-5-8 22:06 | 只看该作者

你的问题不在C语言,而在编译器。

使用特权

评论回复
板凳
node| | 2008-5-9 08:32 | 只看该作者

没有遇到过

使用特权

评论回复
地板
hbjl_pzg|  楼主 | 2008-5-9 08:39 | 只看该作者

编译器?

请问NE5532,编译器会有什么问题呢?

使用特权

评论回复
5
liuxzhou| | 2008-5-9 08:42 | 只看该作者

sbit并不申请变量

sbit并不申请变量,不过指明特定地址,在程序内部使用无法确定该位变量地址

使用特权

评论回复
6
jdb1| | 2008-5-9 09:02 | 只看该作者

最好把你的程序发上来,让大家帮你看看

最好把你的程序发上来,让大家帮你看看

使用特权

评论回复
7
ayb_ice| | 2008-5-9 09:24 | 只看该作者

估计LZ对#include用法不太了解

使用特权

评论回复
8
hbjl_pzg|  楼主 | 2008-5-9 09:32 | 只看该作者

没问题的

#include<stdio.h>
#include<reg52.h>
#include<float.h>
void initial(void);

main()
{ P1=2;
  initial();
  while(1);
}
void initial(void)
{SCON=0x50;
  TMOD=0x20;
  TH1=221;
  TR1=1;
  TI=1; }
这样就没问题

使用特权

评论回复
9
hbjl_pzg|  楼主 | 2008-5-9 09:34 | 只看该作者

没问题的

#include<stdio.h>
#include<reg52.h>
#include<float.h>
void initial(void);
main()
{ P1=2;

  initial();
  while(1);
}
void initial(void)
{SCON=0x50;
  TMOD=0x20;
  TH1=221;
  TR1=1;
  TI=1; }

使用特权

评论回复
10
computer00| | 2008-5-9 09:38 | 只看该作者

有点晕...

1、为什么在主程序内使用sbit关键字会报错?
--sbit必须在函数体外面使用,它只是将一个变量名跟一个可位寻址的位进行绑定。

2、为什么在主程序外对IO口如P1赋值就会报错,提示是重复定义。但是在主程序内就没有问题?
--不能在函数体外对变量进行操作(赋初值除外)。

3、为什么有的函数在主程序外声明,有的却在主程序内声明。有时函数在主程序外声明没有问题,但在主程序内声明就报错?
--函数在使用之前声明就可以了。

使用特权

评论回复
11
hbjl_pzg|  楼主 | 2008-5-9 09:43 | 只看该作者

请问computer00

同样是initial的函数声明,放在main()外就正常,而放在里面就提示语法错误?

使用特权

评论回复
12
noend297| | 2008-5-9 09:55 | 只看该作者

c是以函数为单位的

c是以函数为单位的,命令语句都要在函数体里面,如上面的p1=2;而定义变量的语句都要在命令语句的前面

使用特权

评论回复
13
computer00| | 2008-5-9 10:28 | 只看该作者

函数的声明,也应该要放在函数体外

void initial(void);

void main(void)

 P1=2;
 initial();
 while(1);
}

有些编译器你将函数声明放在函数内部的开始部分也可以编译通过。
但是一致的做法都是放在函数体外。通常是放在一个h文件中,然后include之。

使用特权

评论回复
14
wxj1952| | 2008-5-9 12:28 | 只看该作者

我刚弄懂.

1、#include<reg52.h> 中已经定义了sfr P1=0x90;那么在main( )主函数之前的P1=2;自然是再次定义。而在main( )之内是P1变量使用,而不是定义。

2、C语言规定:一个函数A在使用(被调用)之前,必须事先定义清楚。如果你的函数A定义式放在了主函数main( )之后,就不符合“事先定义清楚”的规定,因为你在main中使用它——函数void initial(void); 之前没有定义,因此这就需要在主函数main()之前加一个“函数A原型说明”以符合“必须事先向编译器说明清楚函数的类型”这个规定,因为编译器需要在使用函数A之前预先为函数A参数/变量分配内存等。
   容易理解,如果你把函数A的定义式(不是原型说明式)前移,放在主函数main()之前,那就不需要“函数A原型说明”了。因为它符合调用前“事先定义清楚”的编译器规则。

使用特权

评论回复
15
hbjl_pzg|  楼主 | 2008-5-9 13:07 | 只看该作者

to computer00

我手上有本教材《单片机C语言程序设计与应用实例》邮电版,上面有写例子也是在主函数内声明变量。我用它的例子编译也没问题。我自己瞎写的这个简单的东西就编译不过,但是只要把函数声明放在最外面就行了。我觉得还是没有找到最主要的原因。

使用特权

评论回复
16
HWM| | 2008-5-9 13:29 | 只看该作者

在C中函数只能在最外层定义,而PASCAL则可以。

虽然在C++中有类作用域,但形式上其成员函数也是只能在最外层定义(内联除外)。

使用特权

评论回复
17
ayb_ice| | 2008-5-9 14:50 | 只看该作者

P1与SFR P1重名

使用特权

评论回复
18
wxj1952| | 2008-5-9 16:36 | 只看该作者

函数原型说明放在主函数内也可以。

看了《单片机C语言程序设计与应用实例》邮电版,确实keil C51编译器支持把函数原型说明放在主函数main()内。没什么道理,以下程序编译通过。主要是函数原型说明必须放在主调函数内“最开始的部分”,而不是任意位置,圈圈说过了,我们都没注意到。
    所以,把P2=2;推后即可。


#include<stdio.h>
#include<reg52.h>
#include<float.h>

main()
{  
void initial(void );

 P1=2;

  initial();
  while(1);
}

 void initial(void )
{SCON=0x50;
  TMOD=0x20;
  TH1=221;
  TR1=1;
  TI=1; }

使用特权

评论回复
19
ayb_ice| | 2008-5-9 16:42 | 只看该作者

P1=2;放在函数外成立定义变量了

相当于int P1=2;只是int可以省略罢了。

使用特权

评论回复
20
hbjl_pzg|  楼主 | 2008-5-9 17:02 | 只看该作者

感谢大家的回复,让我学到一些书本上没有讲清楚的东西

使用特权

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

本版积分规则

16

主题

54

帖子

0

粉丝