打印
[开发工具]

PICC使用中初学者容易犯得两个错误

[复制链接]
1316|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
waveforms|  楼主 | 2019-4-24 14:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原贴链接:https://www.cnblogs.com/hnrainll/archive/2010/12/25/1916628.html


我是初次使用PIC单片机,对PICC的编程规范不了解,在编译程序时老是出问题。现在介绍两个最常见的问题给大家,看看有没有和我遇到一样问题的。
错误1:变量定义赋值先后顺序问题很重要
开发环境为MPLAB IDE V7.43 + PICC 。如下两种代码书写方式,在补充完整之后,哪一个会编译出错?( flag_sendKeyByte 为全局位变量,已定义过)
A:
flag_sendKeyByte = 0;
unsign char mbit = 0;
B:
unsign char mbit = 0;
flag_sendKeyByte = 0;
使用正常的C语言习惯来看,似乎都没问题,都是赋值,仅仅是先后位置不一样。但是在PIC单片机的编译环境下,A是错误的,B是正确的。
在出现这一编译错误时,我查找了很久。由于初次接触PIC,了解不多,导致走了很多弯路。最后逐行删除代码,逐行修改,最后才发现是次序错了。
PIC 单片机的编译环境要求变量赋值必须在变量定义之后。而不允许在给一个变量赋值后再去定义另一个变量并赋值。似乎是因为编译环境在赋值之前会先处理所有的变量定义。如果检测到一个变量赋值语句则该函数或子程序后面的定义它将不再检查,导致最后编译的时候出现某些变量未定义。
(注:以上这些分析是我自己揣摩的,可能分析的不对,还请高手指正)
可笑的是,编译出错的提示信息却是乱七八糟的,而不是说存在未定义的变量。下面的提示就是我编译时提示的,对一个初学者来说,根据这些提示能找到错误源吗?
Error[000] D:\documents\PIC\test\keyboard\ps2.c 387 : probable missing '}' in previous block
Error[000] D:\documents\PIC\test\keyboard\ps2.c 388 : undefined identifier: ch
Error[000] D:\documents\PIC\test\keyboard\ps2.c 388 : constant expression required
Warning[000] D:\documents\PIC\test\keyboard\ps2.c 390 : missing basic type: int assumed
Error[000] D:\documents\PIC\test\keyboard\ps2.c 390 : type redeclared
Error[000] D:\documents\PIC\test\keyboard\ps2.c 390 : identifier redefined: calc_parity (from line 64)
Error[000] D:\documents\PIC\test\keyboard\ps2.c 390 : constant expression required
....
后面还有很多,一直到程序的最后都会提示出错。把A中的写法换成B的写法,编译就成功了。
感觉这个编译环境太不好用了。以前用过C8051F系列的开发工具,那个就好用多了。把这个问题提出来,提醒初学者别犯我这样的错误。
错误2,could not find file 'c018i.o'
在使用MPIDE +MCC18 编译时经常出现下列提示: “could not find file 'c018i.o'”
解决办法:是因为没有指定库的默认路径。点project->build option->project.在Directories选项卡里,点击show directories for:右侧的下拉菜单,找到library search path项,选择new,在新建的项目里指定路径为c:\mcc18\lib。点击确定。再次编译即可成功。

————————————————————————————————
C语言中变量的声明必须在一个block的开头
一个block就是指一对{}大括号包起来的部分
变量的声明必须紧跟在"{"之后,中间不能夹其它代码。
还有比如for(char i=0; i< 20 ; i++){ do something...},这在有的编译器可以用,有的不行
这样的写法也是不正确的,会报一个语法错误,一个变量未声明的错误
如果想用,但是又不想在block的开头去声明这个临时变量i,可以这样做:
{ //注意这个大括号
    char i;
    for(i=0; i< 20 ; i++){ /*do something...*/}
} //注意这个大括号
这样保证了声明在block开头的同时,又能使用局部变量而不用到前面去声明

使用特权

评论回复
沙发
wooda| | 2019-4-24 14:41 | 只看该作者
说到底还是编译器没写好,至少是提示信息不到位

使用特权

评论回复
板凳
ayb_ice| | 2019-4-24 14:45 | 只看该作者
标准C就是这样规定的
变量定义要在前,语句在后

使用特权

评论回复
地板
heisexingqisi| | 2019-4-30 20:48 | 只看该作者
总结的很好啊。

使用特权

评论回复
5
usysm| | 2019-4-30 21:46 | 只看该作者
就是C语言的使用问题了。

使用特权

评论回复
6
typeof| | 2019-4-30 21:47 | 只看该作者
PICC的编程规范不了解

使用特权

评论回复
7
yujielun| | 2019-4-30 21:47 | 只看该作者
MPLAB IDE用熟练就行了。      

使用特权

评论回复
8
htmlme| | 2019-4-30 21:47 | 只看该作者
要有这种发现问题,解决问题的能力 。

使用特权

评论回复
9
pklong| | 2019-4-30 21:48 | 只看该作者
使用正常的C语言习惯         

使用特权

评论回复
10
touser| | 2019-4-30 21:49 | 只看该作者
变量赋值必须在变量定义之后,都这样的。

使用特权

评论回复
11
myiclife| | 2019-4-30 21:49 | 只看该作者
两种代码书写方式都有问题的。

使用特权

评论回复
12
uytyu| | 2019-4-30 21:49 | 只看该作者
flag_sendKeyByte 不能赋值吗  

使用特权

评论回复
13
iyoum| | 2019-4-30 21:50 | 只看该作者
局部变量怎么定义的呢      

使用特权

评论回复
14
jkl21| | 2019-4-30 21:50 | 只看该作者
编译程序时老是出问题,系统会提示的。

使用特权

评论回复
15
iyoum| | 2019-4-30 21:50 | 只看该作者
布局变量不能超出这个范围吗

使用特权

评论回复
16
usysm| | 2019-4-30 21:50 | 只看该作者
编程不出错误基本没有问题。  

使用特权

评论回复
17
typeof| | 2019-4-30 21:50 | 只看该作者
不是跟其他的一样的吗?     

使用特权

评论回复
18
jkl21| | 2019-4-30 21:50 | 只看该作者
PICC的编程规范网上有的。  

使用特权

评论回复
19
yujielun| | 2019-4-30 21:50 | 只看该作者
MPLAB 的教程很多。   

使用特权

评论回复
20
htmlme| | 2019-4-30 21:50 | 只看该作者
有问题再解决问题吧。               

使用特权

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

本版积分规则

32

主题

212

帖子

1

粉丝