- 博客(16)
- 收藏
- 关注
原创 COM本质论读书笔记1
COM本质论读书笔记第一章1.C++类库以源代码形式分发,并且客户把类库编译链接入自己的程序中 缺点:多个可执行文件中有重复的类库二进制代码,升级要编译所有的exe,完全不支持模块化2.提供DLL,让app在用到时动态加载 缺点:1)c++缺少二进制标准,每个厂商的编译器对于函数名变更都有自己一套方案,还有异常方案。 2)由于在
2009-09-05 12:02:00
576
原创 断言式编程再理解
断言式编程再理解通过最近的一个项目,对断言式编写无错程序有了些心得。程序逻辑中在运行中有可能出现的错误要在程序中做处理,比如 malloc失败等,而断言要加在程序在逻辑上不应该出现的错误的地方。在我们编写程序的时候,编写无错程序的秘诀就是“要尽早发现错误”,在开始一个函数时加上前置条件,即进入函数前一些重要的变量应该是什么状态要测试,在函数的末尾加上后置条件,即函数执行后一些变量或数据结构应该是什
2009-08-31 15:25:00
757
转载 嵌入式软件设计中层与层之间接口的设计方式
1. 函数调用缺点:导致层与层之间紧耦合;上下层必须在统一上下文环境(任务环境);有可能产生循环依赖上层很可能并非简单的函数模块,而是具有活动能力的任务模块,但是下层通过直接函数调用方式调用上层接口只能保持在同一个任务运行环境中。并且,上下模块间由此存在循环的依赖关系,即使是在同一个任务环境中实现的上下层模块,这种循环依赖关系也是不利于体系结构设计的。2. 回调函数方式回调函数
2009-08-28 16:32:00
1678
转载 高效大小写转换
汇编中有一种非常高效的方法,即位运算。 大写 二进制 小写 二进制 A 01000001 a 01100001 B 01000010 b 01100010 C 01000011 c 01100011 D 01000100 d 01100100 看出来什么吗? 大小写只有第6位不一样。 故只要改变第6位即可。 大写--》小写:or(|
2009-08-27 17:07:00
633
原创 程序加速之查表法
查表法是通常采用的一种以空间(内存空间)换时间(运行时间)的程序加速方法,基本过程是把需要经常查询数据库或复杂浮点计算的结果保存到一个数据结构中(数组最为常见),以后只要根据条件取出相应的数据即可。比如把1-360度的正切值保存到数组中,当输入45度时,只需取出第45个元素。这样就节约了不必要的计算时间。对于作为基本定义使用的表,数据不经常改变的数据表也可以使用这种方法。注意:1.表的数据
2009-08-27 13:58:00
3044
原创 write solid code:不要使用output memory作为函数内使用的buffer
1.不要使用output memory作为函数内使用的buffer,要使用内部buffer,然后cpy出去错误实例: void UnsToStr(unsigned u,char *str){ char *pch; /* u超出范围吗?使用UlongToStr… */ ASSERT(u/* 将每一位数字自后向前存储 * 字符串足够大以便能存储u的
2009-08-18 08:55:00
449
原创 求数组的子数组子和的max 动态规划程序
求数组的子数组子和的max 动态规划程序 时间复杂O(n) 可以返回最大子数组位置#include #include int maxv(int x,int y){ return (x>y)?x:y; }int main(){ int array[4]={-9,-2,-3,-5}; int i,j; int flag[4][4]={0}; int flagcount=2; in
2009-08-06 10:00:00
315
原创 nstl construct 理解
/*从芯片构造nstl表,应该已经初始化,否则用NstlInitNandIc 普通前向没有链的,都标记为头 普通后向没有链的,都标记为尾 正常的块,前向、后向表中对应,空闲块只需要前向关系 ffp平时0xFF,正常可用块,ffp=0,正常有数据块指向正确位置 逻辑块指向链头 之后前向表为头位置的物理块转逻辑翻译到逻辑转物理 前向块头指向同一个逻辑的,格式化掉短的(因此要先构造前后链表
2009-08-01 15:43:00
349
原创 二分查找的变形应用
算法理解获取数组中第一个空闲的块比如 array 为 1111111…111000000…0问题就变成 寻找array中第一个出现的0算法一:遍历数组找到第一个0 O(n)算法二:二分查找 二分查找成功条件:array[i]=t; 失败条件:l>u对于本问题来说,成功条件则是array[i]=0 array[i-1]=1,失败条件要提前测试 全1的情况stati
2009-07-30 16:10:00
714
1
原创 矩阵链乘法动态规划程序
源程序为 算法导论 动态规划一章 不贴出 这里仅对此程序进行分析 比如有三个矩阵 A1 a2 a3 10X100 100X5 5X50 P0Xp1 p1Xp2 p2Xp3N=3 首先m[1,1] m[2,2] m[3,3]=0 L=2 i=1 j=2M[1,2]=∞K=1 to 1q=M[1,
2009-07-25 12:29:00
425
原创 动态规划和分治法的比较之一个疑问
一个问题:矩阵链相乘的问题,比如 A1 A2 A3 A4 A5 A6六个矩阵,要选择一个最小代价相乘次序,要是按二分法的话,从中间分成两个子链,然后转化为分成求两个子链的最优化乘次序的问题就是不正确的,不能保证优化次序是跨界两个子链之间的,比如最优次序为 (A1((A2((A3A4)A5))A6))就不能用二分法来做,而是应该设这个最佳分割点为k,然后遍历A1-A6,穷举来寻找k,这个过程生成
2009-07-24 10:31:00
1301
原创 write solid code 心得续
write solid code 心得续 1.程序员设计函数时,有时把多个功能给了一个函数,然后利用参数来选择相应的功能,比如void* realloc( void* pv, size_t size );这个函数同时有增大,缩小buf的功能,用参数 size作判断 ;或者,比如 strcmp(str1,str2)用返回 0 正数 负数来 返回结果 ,这样的函数 可读性 防错能力很差,
2009-07-17 09:07:00
625
转载 嵌入式C软件维护经验
本人工作中维护着一个基于嵌入式Linux的一份SIP协议栈。一年多来,有如下心得:(1)非常熟悉你维护的代码,并且为它的体系结构、各个模块(含Makefile之类的软件构建配置文件)、重要函数、重要CASE编写文档。使用Source-Navigator之类的工具高效地浏览整个工程,理清体系结构、调用关系。(2) 嵌入式软件测试技巧:一是要做单元测试、集成测试
2009-07-16 08:49:00
1051
原创 write solid code 心得
1如果算法设计中程序不应该进入switch中的default,为了尽早查出错误可以在default中加断言 default: ASSERT( FALSE) ; I* We should never get here. */ break: 2.对一个程序中的关键函数,特别是这个部分如果被优化,用了复杂的算法,在调试时最好另外用简单的算法写一个功能相同的函数,与关键函数一同运行并在运行完后用断言比
2009-07-12 14:48:00
469
原创 assert vs Defensive programming
Defensive programming 是程序员一般使用的编程方式,也就是对所有有可能(也许是在设计逻辑上没有可能出现的值)的出现的错误进行处理。但这种编程方式会在调试阶段隐瞒错误。要记住,我们编写程序的目的是编写无错的代码,是要让所有的错误不应该再发生,而不是每次去安全处理发生的错误,所以Defensive programming和编写无错程序的理念有点矛盾。但 Defensive
2009-07-10 10:01:00
402
原创 多行代码#define 的技巧
先看一个例子 #define QF_INT_LOCK(_KEY) do{/(_KEY)=get_int_status(); / int_lock(); / }while(0) 在写多行的代码define时 ,最好在外层加上do{
2009-07-09 08:26:00
717
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人