
工作小总结
codetracer
学习造轮子
展开
-
不要用缩写,多写注释
<br />好吧,读别人的代码,有时是一种折磨,例如,无穷无尽的缩写,不知所谓的命名,CpKw 竟然是copyKeyword。。。<br /> <br />还有功能划分,麻烦你多写个函数也不要把,相关性不是非常大的功能放到一起……比如,你判断存不存在一个keyword就判断吧,别在里面把什么判断后再复制什么什么相关信息也放到一个函数里面。<br /> <br />或者你能把注释和名字写明白……我的天,这简直就是在杀生么,还要交流不……<br /> <br /> <br />原创 2010-11-28 17:55:00 · 785 阅读 · 0 评论 -
offsetof 例子
<br />/* offsetof example */<br />#include "stdafx.h"<br />#include <stdio.h><br />#include <stddef.h><br />/************************************************************************/<br />/* Macro OBJECT_HEAD_ADDRESS : calculate the struct's address转载 2010-12-25 16:38:00 · 583 阅读 · 0 评论 -
Linux下,手动加载动态库~~
<br />咳咳,在自己写的函数中加载一个动态库。<br /> <br />----头文件 #include<dlfcn.h><br /> <br />有四位伙计: dlopen(), <br /> dlsym(),<br /> dlclose(),<br /> dlerror().<br />接下来一一登场!<br /> <br />在编译时要加入 -ldl : 如: gcc test.c -o原创 2010-12-28 21:20:00 · 4372 阅读 · 0 评论 -
poll和epoll-----(转)
<br />源码解析,来自 http://donghao.org/2009/08/linuxiapolliepollaueouaeaeeio.html。<br /> 《poll和epoll内核源码剖析》(一)<br /> 《poll和epoll内核源码剖析》(二)<br /> 《poll和epoll内核源码剖析》(三)<br />epoll精髓 在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换转载 2010-12-30 18:00:00 · 578 阅读 · 0 评论 -
Study more
和比自己聪明的能力比自己强的人工作。学习他们的代码,他们的做事方法,看一看那些人是怎么处理错误的。 总是倾听别人怎么说,无论那个的资历和职位是什么样的。 实践,实践,实践,总是不满意于一开始出来的事。 多问问自己,现在在写什么代码?为什么要这样写成这样?还有没有更好的方法? 学习多样的技术,多多比较他们,并一定要了解各种技术的优缺点。 总是问别人问好的问题。 多回头看看走过的路,做过的事,写过的程序,感觉一下他们有多烂。 多读读那些大师写的书。 不要总坐在电脑前编程序,多做做运动,多到户外走走,和非技术人多原创 2011-03-10 18:54:00 · 708 阅读 · 0 评论 -
注意细节和习惯(一)
<br />1.修改的代码先不要删掉,先注释掉。注释掉最好再写写为什么。<br />2.其实一边写代码一边写注释是个好习惯,可以先写说明性注释,再写代码。<br />3.无论什么时候,一定要检验传入函数的参数,还有,申请的空间是否成功,打开数据库,打开文件什么的,是否成功。总之,要加上对指针的检查。<br />4.哈希值是正的……这个事例说明,要想写好代码,就得合理地分配值的存储类型。<br />5.关于数据结构,这个东西直接影响到到代码的实现。所以,设计一个好的数据结构,是捋顺思路的良好助推器。<br /原创 2011-03-11 20:47:00 · 653 阅读 · 0 评论 -
关于多线程/多进程的一些思考
<br />在单核的机器上使用多线程/多进程更多是为了提高用户的体验,而不是提高效率。相反,因为线程调度和同步的缘故,反而会降低效率。不过有时候,可以让逻辑更加清晰,给程序员带来了便利。对于一些监视器,多线程也算是一种优化,毕竟,很多时候,监视器都是在做没有意义的循环检查。<br />由此联想到我们自己,同时处理多件事,除了让你表面上显得很有能力,但实际上,咱们在花费大量时间协调这些事情,而且很可能在关键位置处就停止了,不得不切换到另一个事情。可是咱们保存现场的能力却是极其有限的,回头切换进程的时候,很可能原创 2011-03-13 09:45:00 · 629 阅读 · 0 评论 -
C++ 向前引用声明
1.首先,想要写一个好程序,就得记住一件事,先设计一个好的数据结构!2.其次,语法细节……为什么出问题,是因为写得不够好!今天调试一个程序,因为,vector 的默认范围太大,造成了释放栈的时候多释放了一部分……悲剧了一下午。映射用的hash表和被影射的数组没有放到同一个类中,导致传数据的时候失去了一致性,没办法,重新设计类,将参数组合。原创 2011-03-18 00:44:00 · 7200 阅读 · 1 评论 -
选择数据类型
今天用聚合算法跑30亿条数据库,结果计数器设为int类型,导致计数溢出,程序跑没影了……vc++2008中,int类型是-21亿到21亿……没办法换成unsigned int了。白白跑了一晚上啊……一切重新开始。原创 2011-03-27 01:18:00 · 553 阅读 · 0 评论 -
哦……std::bad_alloc
<br />这几天写的算法用于海量数据处理。然后挺悲剧的是程序在处理大量数据的时候很快就抛出 std::bad_alloc,然后自动退出了。等了n久的结果啊 ,就这么一下没了。 回头看看代码,不知道为什么,就是动态申请使用的非常多,可能是野指针,也可能是在动态申请的时候,一下超过了2G,电脑罢工了……后来使用内存池,好多了。关于这个异常 这里 有个不错的说明。<br /> <br />关于release 和debug版,不止是有没有调试信息那么简单,可以看这里。其中有个关于内存分配的原则,就是release原创 2011-03-24 07:29:00 · 3116 阅读 · 0 评论 -
注意细节和习惯(三)
<br /><br />1,void* 在c语言中的使用,类似于C++的模板类。<br />2,别的模块没有显式使用的函数、变量等,都应该放在实现文件,定义成static,避免造成命名污染。<br />3,没有必要的情况下,不可以在头文件中放其他的头文件,容易造成命名污染,难查bug,而且编译也慢。如果有很多的实现文件需要共用一些东西,可以用一个专门的头文件放,也可以放内部的inline函数。<br />4,在头文件里,一般只放inline函数,<br />5,用宏,展开时可以很灵活地生成各种代码,<br原创 2011-04-06 19:27:00 · 771 阅读 · 0 评论 -
不做机器人,就来自动化!
对于重复的工作,如果已经被遇见,或者是被发现,立刻,找个自动化工具,或者抓紧时间造一个!磨刀不误砍柴工,大量重复的工作一旦出现,只会成指数级别地增加,这个时候,最明智的方法就是偷懒!!马上写个机器人!代替你完成这些枯燥没用的重复工作!比如进行单元测试的数据收集和用例输入、记录工作!!不要太勤快,写个脚本什么的!读写性能的考察,一定要和用到的磁盘挂钩,不要认为只是软件的问题,一旦和硬件相关了,就必须考察硬件!所以,了解硬件知识,尤其是它们的缓存机制,是十分有必要的!精确度问题,比如函数耗时,如果统计的粒度太小原创 2011-04-25 19:19:00 · 777 阅读 · 0 评论 -
注意细节和习惯(四)
好吧,尽管说,一直认为变量初始化非常重要,但是在不经意之间,像数组,结构体一类的变量就容易忽视初始化。尤其是在粘贴来自别处的代码时,首先粘贴就是一种容易隐含有重大错误的行为,其次,这次直接告诉我,还容易把初始化过程遗漏……今天使用openMP的时候,就因为一个数组没有初始化,结果,导致一个八竿子打不到的地方一直踩内存……凶悍地浪费生命。而这段代码,是从同一个作用域别的地方拷过来的,结果由于在原来的地方,提前初始化了,导致初始化的代码没有拷贝过来……在跑openMP的时候,发现cpu的时间是按照核数来算的。怎原创 2011-04-27 16:37:00 · 606 阅读 · 0 评论 -
offsetof
在嵌入式应用中,或许你对offsetof接触不多甚至根本没见过。如果是这样,那么从这一刻起就好好地掌握它,让它成为你的又一杀手锏吧。1. offsetof与EEPROM<br />我们许多人可能都使用过一些非挥发性的存储器,如常见的EEPROM。我们经常使用它们在存储一些系统的配置参数和设备信息。在所有的EEPROM中,通过串口访问的占了大多数。一般来说,对串口的访问都是按字节进行的,这使得我们不可避免会设计出下面的<br />接口去访问EEPROM的信息:/*从EEPROM 偏移量offset处读转载 2010-12-25 16:26:00 · 822 阅读 · 0 评论 -
通用性更强的双向链表
<br />#ifndef _LIST_H_<br />#define _LIST_H_<br /><br />#ifdef __KERNEL__<br />#include <linux/stddef.h><br />#else<br />#include <stddef.h><br />#endif<br /><br />#ifdef __cplusplus<br />#define list_inline inline<br />#else<br />转载 2010-12-25 15:08:00 · 619 阅读 · 0 评论 -
将子网掩码换算成IP段~
<br />struct IP_t<br />{<br /> int start_ip;<br /> int end_ip;<br />};<br /> <br /> <br />已知 mask_ip 和 start_ip, 求end_ip.<br /> <br />pIP->end_ip = ((pIP->start_ip & pIP->end_ip) | (~pIP-> end_ip));<br /> <br />呵呵,理解要透彻啊原创 2010-11-29 08:45:00 · 1235 阅读 · 0 评论 -
注意命名啊
<br />晕死,因为命名的相似度太高,代码过密,一个小bug卡了我那么长时间……<br />array 与 array2…… <br /> <br />以后命名要有意义啊……还有就是相似度要降低……不然自己看了眼都晕。<br />注释注释注释!!原创 2010-11-28 14:23:00 · 392 阅读 · 0 评论 -
判断一个子网掩码的合法性
<br />1,首先,保证str为小端模式。<br />2,其次,验证str转化成的IP为合法IP<br />3,(mask -1 | mask) == 0xFFFFFFFF ,如果是TRUE就是子网掩码,是FALSE就不是子网掩码。原创 2010-12-10 17:15:00 · 8632 阅读 · 1 评论 -
str.erase
<br />erase函数的原型如下:<br />(1)string& erase ( size_t pos = 0, size_t n = npos );<br />(2)iterator erase ( iterator position );<br />(3)iterator erase ( iterator first, iterator last );<br />也就是说有三种用法:<br />(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1原创 2010-12-10 17:42:00 · 1051 阅读 · 0 评论 -
代码量需要增加
<br />一直在调试的一个模块,问题很简单,就是有一个指针,没有检查是否指向有效地址就直接使用了,导致一直卡在一个地方。无论单线程还是多线程,无论有多么确保这个指针会指向有效的地址,用之前都要慎重,再慎重!不确定的,一定要做个检查,发出有效信息,以后调试错误,也要首先确定这些地方没有问题,在驱动中,这是致命的。<br /> <br />访问越界,多使用memcpy,strncpy,这些可以控制长度的拷贝!而且长度的选择也要慎重,至少不要越界,还有,对于C风格的字符串,有时后/0会不小心被省略,或者没有复制原创 2010-12-08 20:01:00 · 749 阅读 · 0 评论 -
strtok()
<br />好吧,下次用一定会看准原型的。<br />char * strtok(char *s,char *delim);<br /> <br />注意了,两个都是字符串。<br /> <br />首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。<br />strtok在s中查找包含在delim中的字符并用NULL('')来替换,直到找遍整个字符串。 char * p = strtok(s,";"); p = strtok(null,";"); 在调用的过程中,字串s被原创 2010-12-13 21:14:00 · 453 阅读 · 0 评论 -
CString,string,char*之间的转化(内部的?)
<br />CString csOne ;<br />string str;<br />char* chr;<br /> <br />csOne = str.c_str();<br />str = csOne.GetBuffer(0);<br />chr = str.c_str();原创 2010-12-13 21:05:00 · 408 阅读 · 0 评论 -
fd_set....
<br /><br />select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fe_set的内容,由此来通知执行了select()的进程哪一socket或文件可读。<br /> 多端口复用函数select在调用前要首先设置监听的端口数目,FD_ZERO是清空端口集,FD_SET是设置转载 2010-12-19 17:17:00 · 556 阅读 · 0 评论 -
读书的方法,及基本好书。
<br />1,如果一本书的书名中带有“原理”两个字,一定不要去记忆它其中的细节,你应该以一天至少50页的速度掌握其要领。尽可能多的在计算机上实现一种理论或者算法。<br />2,the it home!!~~<br /> <br />===================================================================================<br />=================================================原创 2010-12-22 19:55:00 · 652 阅读 · 0 评论 -
setsocketopt。。。。
<br />1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:<br />BOOL bReuseaddr = TRUE;<br />setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char*)&bReuseaddr, sizeof(BOOL));<br /><br /><br />2.如果要已经处于连接状态的socket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:<br />BO转载 2010-12-21 21:42:00 · 1071 阅读 · 0 评论 -
c++运算符优先级表
鉴于公司出现了因为运算符优先级而诞生的bug,所以决定收藏一份。如果不确定,就用括号吧,即使确定了,也要使用括号,保证别人能看懂。if(0x0032 & pretime == fronttime);先做了与,后作了==。。。PrecedenceOper原创 2011-08-01 14:18:03 · 637 阅读 · 0 评论