如何让代码从“无”到“有”-WINCE下的MFC编程

http://blog.csdn.net/vivitue/article/details/6329139

如何让代码从“无”到“有”

(WinCEEVC编程)

Anthor: vivitue

上篇:原理废话

自我介绍下:

我是谁,有什么资格来谈C/C++?我算是半程序员吧,能写10 000+行的代码,能在一天之内搞定n个独立的MFC应用程序的开发,能用C在WinCE下开发ARM7/ARM9的驱动。所以我还是有些资格。当然,我没孙鑫那么NB去写一本《VC++深入详解》,所以要是有那么高的期望我给你讲清楚下面我所提到的每一个变量,你可能要失望了。

既然是有些资格而不是有资格,下面的东西也许有用,亦也许没用。随便吧

不讲原理的书是好书吗?在这个注重结果的年代,当原理都变成了垃圾,还长篇大论不是垃圾是什么?需要看是什么原理又是什么人写的原理吗?亦随便吧。

相信懂C/C++的不少,但能用它做东西的人不多亦不可能多!也许你会认为这太危言耸听了,完全胡说八道,世界上不是那么多程序员吗,难道他们只懂C/C++/C#伊或Java伊或Delphi伊或是QT或是ASP/JSP。。。。。。。。难道都不能用它们来做东西吗?那这世界如何还在运转?我告诉你答案吧:他们都在用别人的代码!

也许你不信,但有一件事情你应该相信:世界上只有一个Mark Zuckerberg所以亦只有一个Facebook,世界上也只有一个Larry Page,所以也只有一个Google,世界上只有一个Bill Gates,所以只有一个Microsoft。为什么?因为他们在用自己写的代码,因为他们具备让代码从无到有的能力。在这个世界上,许多人都一样,他们并不羡慕那些通过十年甚至几十年的时间通过一步一步积累并努力才取得成功的人,他们羡慕的是那些通过短时间就取得成就的人。也许你会认为这太功利主义,这与代码有什么关系,我来说吧,别人十岁的时候在写代码,你在干嘛?所以,想想《社交网络》为什么会如此成功,难道程序员都是天才吗?!

这个世界上没有天才,没人可以无师自通,谁对一种东西用得最多,谁注定会成为一种东西最了解的人。有人永远都不会明白一个整形变量int对他意味着什么,一个常数5与5.0又对他意味着什么,在我们眼里,5=5.0当然都成立,有什么区别吗?能说吗?如果不信,那看下面的代码吧,能在1分钟知道Resultv是多少吗?

 

 

图 1 AD转换Resultv值测试

 

如果不知道,如果算错了。别告诉我什么原因,只证明一个问题,你一定没自己写过多少代码,至少不会写代码,不会让代码从到有。

记得学C++语言最开始是2004年,那时老师就告诉我在C++语言中:

float k;

k=5/9=0.55555555555555555555;

k=5/9=0;

第一次的时候也许不明白,有些奇怪,并就此忘了。这太正常了,那些简单的不能再简单的原理为什么就那么容易忘呢,并还为此而犯下不可思义的错误,是我们脑子不正常吗?

因为在以后的生活中你用到的是k=5/9=0.55而不是k=5/9=0。忘却并不是什么过错。亦因为我是7年后的今天才想起当时老师曾经说过5/9默认int变量计算而不是浮点计算,因为5/9≠0.55而是0。要浮点必须强制转换float(5)/9=0.55或5.0/9=0.55或5/9.0=0.55……….

原因析:看C++编译器默认行为

C++编译器,int变量,float变量是什么?在VC++的编译器中,int变量有2种:

1) 用户定义的int变量

2) 我们用的常数……..-3 -2 -1 0 1 2 3 4…….

2÷1=2

你会写成2.0÷1.0=2.0吗?

在人的正常思维中,我们不会把1 2 3 4当成是int变量去运算,我们都习惯用1 2 3 4去运算,并不会把它当成一些特别的东西去处理,除非我们脑子有毛病,运算2÷1用2.0÷1.0。但计算机没那么聪明,计算机知道1与1.0有什么区别吗?不知道!所以开发VC++的程序员为C++编译器定义的默认行为是 : 2/1=2是整形运算. 2.0/1=2.0是浮点运算

所以 7/8 =0  ;  200/15000=0

所以:

5/(3045-2041)=0  Resultv=5*(tempCurve-2041)/1004=0

所以,图1 中Resultv赋值是有问题的,因为我们即便定义一个float变量Resultv保存运算结果,但5*(tempCurve-2041)/1004是整型运算,我们等于把一个整形变量赋给了1个浮点变量。它怎么会不是0 (0.00000)呢。这就是永远是0的变量。

改进办法是:Resultv=5*(tempCurve-2041)/1004.0

Resultv表达式中的任意一个变量变成浮点或在整数前加强制转换符(float)

看到这儿你也许会说,你说这么多废话为什么不直接说把整形运算转换成浮点运算不得了,说这么多废话干嘛?如果你非要这么认为,我的确是疯了。

有谁会去关心多线程中卖出了是0坐位的火车票,除了卖票的人,天知道?!所以,孙鑫的书NB,他能解决问题并讲解到每一个细节,因为当他说Ctrl+w可以打开ClassWizard的时候就已经很NB了,除了程序员会关心ClassWizard,天知道Ctrl+w是什么东西!

 

如果从图 1 AD转换Resultv值中你能发现Resultv表达式有问题,那我说你是NB,如果发现不了,那就XX了!

说明:图是我们花了1天才解决的BUG,并发现了问题的所在,因为一个比我多10倍编程验有余的嵌入式编程开发者都没发现,你有什么资格去发现并解决它?!

谁疯了会去写这样的一个简单得不能再简单的测试程序?那为什么会错?

 

图 2 C++编译器int变量运算默认行为测试

能看懂下面我在干什么吗?

 

图3 m_avPfMode测试

如果看不懂亦不用伤心。因为没有人会明白下面的东西包含多少代码,m_avPfMode又关注得是什么。程序中最难的,就是出了问题不知道问题在什么地方,尤其是当所有代码都正确的时候,debug有用吗,你永远不会明白把m_avPfMode=!m_avPfMode加在一条完全不相关的语句的前面有后面会有什么后果伊或是严重后果。程序员就像二战期间的间谍,失败了不能气妥,成功了不能喜悦,一切都是隐藏,如果间谍都像007那样么张扬,世界上的间谍早被kill光了。

 

 

图 4电液转辙机综合测试系统

从无到有下篇:代码

1) 程序注释结构

2) 填充代码

具备这2步,如果C/C++语法你没问题,写代码按正常思维来就可以了。从无到有结束

说明:这不是我的思想,而是一个比我NB几十倍的嵌入式编程者教给我的思想,我只是把这种想法实现的其中一个,仅此而已。(生命都有影响我们的人,这些人very, very important,这些人值得记念)

永远记住。想自己写代码,一定要先写注释,把注释当成一种编程的思想。当然如果你不理解等到你具备写代码的能力的时候你就会明白。写代码从无到有最重要的是什么?是C/C++语法,类对像成员变量?数据结构?都不是。是写的能力,动手的经验。否则即便你会C/C++你也不会写代码。

以EVC下的MFC与IAR下的CC2430为例:

试下:单片机如何读传感器数据?脑子中什么概念?如果不懂单片机,相信什么概念都没有,如何读?

例1:如何读一个单片机某个数字引角上的数据?(如何知道某个引脚上的数据是0/1)

答曰:不知道?知道。

{

定义并初始化P0

P0_4/P0_7数字口

//读算法: 1&某位=0,说明这位是01&某位=1说明该位为1

16进制保存该读数 数据格式: 1111

//取反处理及非可见字符打印处理

串口以16进制输出P0_4/P0_7数据

//16进制打印算法: val<10,直接+0打印,val10,val-10+ ‘A’打印

}

 

        图 5读拔码开关状态位(CC2430)                   图 6 注释代码结构

如果能看懂上面的代码,那好。不用看下面。如果看不懂,那看图6中EVC环境下一个线程中的一段注释代码结构吧:

实现代码:

 

 

 

图 7 实现代码

 

图 8 实现代码2

能看懂图6吧,都是中国人,相信没人看不懂汉字。图7图8呢?这次没那么幸运了,我不会像[上篇:原理废话]详细讲解每个变量含义,每条语句执行情况,每个if语句实现函数,算法啊。不废话了,我说:图7、图8是图中中ARM9中PWM控制的实现代码中的一小部分。

 

 

图9 ARM9开发平台中PWM测试

最后的结论:

记住一句:编程没有人可以教会你,除了你自己。

别人给予的都是思想与结论,如果连C/C++基本语法类、成员变量、指针、成员函数调用都忘了,想实现它,那你可得费点精力去重操旧业把C/C++基本语法先整明白了。就像第1个一样的,当你没遇到问题的时候,不会明白一个5/8与5/8.0有什么区别。因为不会用AD中的我要浮点变成了 (tempCurve-2041)/(3045-2041)=0

代码先写中文注释,再填充代码,你就可以从无到有了,写函数你会如鱼得水。

最后决定一个程序员高度的是:发现BUG并解决BUG的能力。因为BUG只能在实际项目中遇到、并发现、并解决。所以真正提升一个程序员能力的是解决来自项目中那些无数的问题,而这些问题答案,在书上,没人告诉你!

接下来,什么结构体、类啊、成员函数定义实现、调用啊,都是简单活,什么都会了,重要的是如何实现你的思想,那时你走到了编程的核心:算法。到了那时,你还会羡慕那些几千上万行的代码是怎么写成的吗?还担心单片机的程序如何才能写出来吗?!

想想:这个世界上的事,都是人在做,为什么偏偏不能是我?当然可以是你!你写1000个像下面的这样的函数,上万行代码不就成了吗?!

 

图10 从无到有(AD转换函数)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值