完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
谢谢糖烧熊,我也发现了这的确可能是个问题。
刚才也在网上查了些资料有些感想,发上来给大家看看有没有谬误。 |
|
|
|
|
|
本帖最后由 zbfisthebest 于 2013-1-8 20:46 编辑
习惯上来讲,C文件不能被#include,但是如果你将其加入工程中,几个C文件都可以被编译,但是注意几个C文件中必须只能有一个MAIN()函数,也就是说除了放MAIN()函数的那个C文件,其它C文件都是用来放子函数和局部变量的。 HEAD文件可以使用#ifndef...#define... 函数或变量的定义或声明#endif的格式对函数或变量进行处理,但是网上也有人说了这个措施只能防止一个C文件对H文件的重复引用(本人未证实),所以感觉上还是不保险。所以多个C文件引用有定义函数程序的头文件的话会导致子函数的多次被定义。 |
|
|
|
|
|
本帖最后由 zbfisthebest 于 2013-1-8 20:33 编辑
而保险的措施则是HEAD文件仅仅是对函数或者外部变量的声明,声明而已,定义这种事情则是由不会 被INCLUDE的C文件来做,这样H文件和C文件也做到一对一有条理一点。 但是如果一个工程里只有一个C文件的话(H文件里可以include H文件但是一般不这么做),或确保如 “include "aa.h"”这句话只出现过一次那么就不会出问题(实际一个C文件,由于#ifnedf的存在还是保险的),而H文件之间子函数的相互调用可以用 extern void a(void);完成,当然互相调用得比较少这样完全可以。这只是模块化编程的一种方式而 已。。。 当然我还是建议大家养成良好的习惯,如鸿哥的代码是经过锤炼了的。 |
|
|
|
|
|
当然鸿哥的代码只是一个参考标准而已,就像参考答案一样,非常准确。但是我们要做得更多的是思考为什么答案就是这样,却不是那样,看起来简单的几段代码有可能是当事人调试过很久,改进过多次,经过时间累积,确认无误后才得出的。答案的背后这种经验积累和思考的过程才是最宝贵,最值得我们学习的。
|
|
|
|
|
|
|
|
|
|
翔哥的程序也挺清晰的!
|
|
|
|
|
|
|
|
|
|
|
|
呵呵,我来解释下,出现循环编译的情况,(按照只用多个.h文件的情况) 假设你在 a.h文件引用 b.h内的函数,那么你是不是要在a.h中定义“#include b.h”,若同时项目中你发现在b.h中需要用a.h中的函数,同理你是不是要在b.h中定义“#include a.h”。此时就出现#ifndef。。。。。(后面内容字太多,你们思考考),会出现的现象是:编译b.h时紧接着编译a.h,编译a.h又紧接着编译b.h。。。。。以此循环。。。编译器报错。。。 虽然,这种情况你现在可能还没用到、发现,,但随着你项目的复杂度增加,会出现此类问题, 以上仅本人拙见,,,我也是刚毕业,更期待大家的共享。。。。还有顶鸿哥,,, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
楼主说“从来没有高人去带我教我,遇到所有的技术问题都要自己硬着头皮去摸索”,我觉得楼主应该再介绍一些你遇到困难是如何摸索的,没有高人带,感觉好像目光和思路都很受限制,不知道楼主是什么处理的。我觉得这个才是更重要的。
同时我要不断的关注你的帖子。。讲的很好 |
|
|
|
|
|
第二节:独立按键扫描与蜂鸣器//大小写要注意,否则编译时会出错,按键1扫描我已经用【 】作了修正
void key_scan() { //按键扫描函数 If(key_sr1==1) //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位//【 If应改为if】 { key_lock1=0; //按键自锁标志清零 delay_cnt1=0; //按键去抖动延时计数器清零,此行非常巧妙 } Else if(key_lock1==0) //有按键按下,且是第一次被按下// 【Else应改为else】 { ++delay_cnt1; //延时计数器 If(delay_cnt1>cnt_delay_cnt1) // 【If应改为if】 { delay_cnt1=0; key_lock1=1; //自锁按键置位,避免一直触发 key_sec=1; //触发1号键 } } -------- -------- ------- } |
|
|
|
|
|
第二节:独立按键扫描与蜂鸣器//大小写要注意,否则编译时会出错,按键1扫描我已经用【 】作了修正 void key_scan() { //按键扫描函数 If(key_sr1==1) //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位//【 If应改为if】 { key_lock1=0; //按键自锁标志清零 delay_cnt1=0; //按键去抖动延时计数器清零,此行非常巧妙 } Else if(key_lock1==0) //有按键按下,且是第一次被按下// 【Else应改为else】 { ++delay_cnt1; //延时计数器 If(delay_cnt1>cnt_delay_cnt1) // 【If应改为if】 { delay_cnt1=0; key_lock1=1; //自锁按键置位,避免一直触发 key_sec=1; //触发1号键 } } -------- -------- ------- } PCB打样找华强 http://www.hqpcb.com 样板2天出货 |
|
|
|
|
|
|
|
|
|
本帖最后由 jianhong_wu 于 2013-1-10 12:06 编辑
我解决问题的途径有三个来源。 (1)在网上查找,看看有没有前人也遇到过这样的问题,从中可以受到启发。 (2)不惜金钱买相关的书或者对应的学习板子来做参考。 (3)自己动脑筋找原因,不断地做实验来调试验证,最后实在不行就更改硬件电路,更换芯片,重新设计方案。 虽然我号称没有高人带我,但是人活在世上,肯定不是孤立的,一定是站在前人的肩膀上发展的。书本与网上的经验就是带我的“高人”。只是现实中没有一个具体的师傅带我,害得我不得不自己去摸索总结,因此我的东西带了非常多我个人的色彩。 |
|
|
|
|
|
|
|
|
|
我解决问题的途径有三种: (1)在网上查找,看看有没有前人也遇到同样的问题,从中受启发. (2)不惜金钱买相关的书或对应的学习开发板做参考。 (3)自己动脑筋找原因,不断地做实验与调试来验证。实在不行就更换硬件电路,更换芯片,更改方案,重新设计。 虽然我号称没有高人带我,实际上网络的经验与书本就是带我的“高人”。只是现实中没有一个具体的师傅带我,害得我从一出道开始,就不得不自己摸索总结,所以我的东西都是非常源生态,都带着非常多我个人的色彩。因此我把标题命名为“吴坚鸿单片机程序风格赏析”。 |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2077 浏览 1 评论
3501 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2333 浏览 2 评论
2760 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4015 浏览 5 评论
966浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6349浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 14:54 , Processed in 0.840548 second(s), Total 88, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号