编程思维的点滴
来源:互联网 发布:中国知网cnki数据库 编辑:程序博客网 时间:2024/05/16 09:01
编程思路要清晰,要对自己所要做的事情有个百分之一百二十的了解。
不能模棱两可差不多就行。
往后的日子还很长,只图一时的爽快,将得不偿失,不值得,
甜在前头,苦在哭在后头,是令人很烦恼的一件事情。
无论时间多么仓促,自己都要想办法弄清楚自己所面对的是什么东西,
我要把它做成什么样子,做到什么程度。
做任何事情,试错没有问题,但不能不经过大脑而满目的如无头苍蝇一般胡乱瞎捉摸,那样只是做无用功,甚至会适得其反。
要经过自己的脑袋思索一番,想象一番,沿着可能的条件和方向摸索,
你会像在黑暗中摸索前进的道路一样,你会渐渐靠近出口,渐渐靠近光明。
编写软件,要分清程序的架构,层与层、模块与模块、接口与接口之间的联系。
既要熟悉各层、各模块、各接口的内容,
也要熟悉它们组合后系统的概貌和逻辑,
知道系统是什么,它能干什么,不能干什么。
以windows下程序为例。
它们分用户模式和内核模式。
用户模式的程序有应用程序、用户dll和系统dll。
内核模式有内核、驱动程序和硬件。
从分分层的角度看,由上往下,一次是应用层程序,然后是dll、lib库,
然后是驱动,然后是fpga,然后是硬件。
在编写驱动的时候,有时候需要上层的东西。
一个寄存器,它里面的bit位被用于不同的作用。
现在要扩充一个寄存器的一个bit位,
很显然,应用层需要修改,lib需要改动,同样驱动也要改。
比如:
typedef union EXAMPLE{ struct { ULONG a : 1; ULONG reserve : 31; }u; ULONG v;};typedef _REGISTER { ULONG r_example; ...;}REGISTER, *PREGISTER;VOID SetRegistereR_exampleA(PREGISTER reg, ULONG a){ ULONG v; EXAMPLE e; e.v = READ_REGISTER_ULONG(®->r_example); e.a = a; WRITE_REGISTER_ULONG(®->r_example, e.v);}
现在union EXAMPLE里要扩展u的一个bit位,比如扩展成如下:
typedef union EXAMPLE{ struct { ULONG a : 1; ULONG b : 1; ULONG reserve : 30; }u; ULONG v;};
那么要增加一个设置b的接口,可以把函数SetRegistereR_exampleA扩展一个参数,如下:
VOID SetRegistereR_exampleA(PREGISTER reg, ULONG a, ULONG b){ ULONG v; EXAMPLE e; e.v = READ_REGISTER_ULONG(®->r_example); e.a = a; e.b = b; WRITE_REGISTER_ULONG(®->r_example, e.v);}
但这样改接口SetRegistereR_exampleA,会带来所有调用SetRegistereR_exampleA地方的修改,一些调用SetRegistereR_exampleA的地方,没有办法获得ULONG b参数信息,
因此扩展SetRegistereR_exampleA一个参数不是一个好办法,有的时候都不能这么弄。
看看SetRegistereR_exampleA函数里面,它是读一个寄存器,只是修改跟a相关的,再写寄存器,因此,可以再写一个接口SetRegistereR_exampleB,专门修改b,
比如如下代码:
VOID SetRegistereR_exampleB(PREGISTER reg, ULONG b){ ULONG v; EXAMPLE e; e.v = READ_REGISTER_ULONG(®->r_example); e.b = b; WRITE_REGISTER_ULONG(®->r_example, e.v);}
SetRegistereR_exampleB函数是,
- 编程思维的点滴
- 思维点滴
- “编程思维”与“编程思维”的培养
- 12堂思维课的读后点滴
- 编程的误区,思维啊思维
- 编程点滴
- 点滴编程
- 编程点滴
- 基于性能的编程技巧点滴
- 基于性能的编程技巧点滴(转载)
- Linux下的编程环境知识点滴
- 编程点滴之2的n次方
- Win32编程点滴之窗口的位置
- 点滴记录:我的编程之路
- 在csdn 上安个家,记录编程的点滴
- wininet网络编程cookie的点滴研究
- 面向对象的编程思维
- 编程逻辑性思维的重要性
- ajaxfileupload.js异步上传图片
- 微信公众号开发---微信请求服务端取值问题
- 二叉树的创建和三种遍历方式
- POJ---3468-A Simple Problem with Integers(线段树)
- 【调试】Linux下超强内存检测工具Valgrind
- 编程思维的点滴
- map端执行流程分析
- 屏幕旋转概述
- maven-surefire-customresult插件
- n个数逆序
- CSDN Markdown简明教程1-关于Markdown
- loadrunner之协议选择
- android编码的理解2
- Spring对JDBC的支持 Jdbc Template模板类