
C/C++
ah__fu
这个作者很懒,什么都没留下…
展开
-
快速排序算法代码(高手勿进)
昨晚复习了一下丢了好久的《数据结构》。 复习了一下快速排序,写了几遍发现是错的,最后发现教科书的例子就是错误的…………倒!难怪中国的计算机发展不上去!!! 贴出代码吧,就当备忘录: void QuickSort(int Data[], int Start, int End){ assert(NULL != D原创 2006-05-31 13:47:00 · 1259 阅读 · 0 评论 -
小小研究一下VC编译器cl.exe的文档生成功能
俺电脑上装的VS2005,一次查cl.exe的帮助文档的时候,发现里面有个/doc的选项,可以将注释生成文档。于是小小测试了一下: cl.exe /doc"obj/MyClass.xdc" /Fo"obj/MyClass.obj" src/MyClass.cpp 源码里面以///开始的注释后的内容都会被提取出来当成文档,具体的标识与C#相同,如:/// /// 作为文档的注释//原创 2007-12-12 17:00:00 · 932 阅读 · 0 评论 -
复杂的GCC字符串池
最近写的一个程序,为了使接口简便,在返回字符串的时候不得已使用了stl::string,但是又担心如果此方法被频繁调用,可能会导致性能问题,于是尝试用一些底层机制去优化stl::string。 stl::string是怎么实现的呢?脑海中有一个猜想,首先就是这样:class string{private: char* m_str; int m_len;}; 为了验证原创 2008-02-05 12:09:00 · 1391 阅读 · 0 评论 -
C++学习:驱动代码里发现的一个小技巧,求大于I的最小的SIZE倍的值
最近在研究驱动的代码,发现这样一个宏,没太搞懂什么用途:#define E1000_ROUNDUP(i, size) ((i) = (((i) + (size) - 1) & ~((size) - 1))) 调用的时候是这样的: unsigned int i = 4097; E1000_ROUNDUP(i, 4096); 拆解这个运算,还是没明白到底要干什么:简化的表达式相原创 2008-02-01 12:14:00 · 673 阅读 · 0 评论 -
C++学习:inline的函数或者成员函数一定要定义在头文件中
看C++的教材的时候,一直记得书上说inline只是一个提示,编译器可能会拒绝将函数定义成内联的。今天犯了思维定式的错误:函数或成员函数加上inline的时候,其实现部分一定要写在头文件中,否则链接的时候将发生找不到引用的错误(GCC编译器在编译的时候还会给出警告)。 请看下面重犯这个错误的代码:// MyClass.h#ifndef _MY_CLASS_H_#defi原创 2008-01-28 20:38:00 · 1069 阅读 · 0 评论 -
c++学习:记一例namespace和类型声明引发的编译问题
编码中发现一个奇怪的编译错误,花了很长时间才找到问题所在。下面把重现这个问题的最精简的代码贴出来:/**//*MyClass.h存在一个namespace和一个类*/#ifndef _MY_CLASS_H_#define _MY_CLASS_H_namespace MySpace...{class MyClass...{public: int Field;};}#endif原创 2008-01-22 10:14:00 · 1209 阅读 · 0 评论 -
STL在服务器程序开发中存在的三大问题
当我问及一些同行的朋友对于服务器程序中STL的使用情况的时候,他们都回答在自己公司的服务器程序开发中,一般都不使用STL。 为何标准库在服务器程序开发环境中受到冷遇呢?我觉得在服务器程序这种高稳定性、高性能、高并发的环境下,STL存在着三大问题。 问题一:不能确定STL如何管理内存。假设就按照STL默认的方法来管理内容,则服务器在长时间的分配和释放内存后,容易导致内存碎片,对原创 2007-05-30 15:03:00 · 1602 阅读 · 6 评论 -
小记:C++操作符重载后的调用格式
看到这个标题的时候不要骂我:重载操作符了以后,就像使用操作符一样,就能够调用重载的操作符了。 是滴,没错,但是这里要记一些其他的调用方法:#include stdio.h>class My...{public: int operator[](int index) ...{ return index; } void Print() .原创 2007-08-26 13:37:00 · 933 阅读 · 0 评论 -
小记:注意fread和fwrite的参数顺序
C标准库提供的文件函数fread和fwrite的原型为:size_t fread( void *buffer, size_t size, size_t count, FILE *stream );size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );原创 2007-12-19 11:33:00 · 1440 阅读 · 1 评论 -
转:C++资源之不完全导引
真没想到在C++领域居然有那么博学的人!!出处:http://dev.youkuaiyun.com/article/56/56334.shtmC++资源之不完全导引 [上] 撰文/ 曾毅 陶文 最后更新:2004年6月11日 声明: .本文2004年5月首发于《优快云开发高手》,版权归该杂志与《程序员》杂志社所有。杂志限于篇幅部分内容有所删节,此处版本为相对完整版本。 .本文为介绍性文章,会随笔转载 2007-12-19 13:59:00 · 563 阅读 · 0 评论 -
GCC:预编译头文件的尝试
公司开发了一个自己的基础类库,有着庞大的头文件。为了便于使用并提高编译速度,尝试了一下GCC的预编译头文件的功能:1、先定义头文件afl.h,内容如下:(afl意味a framework library)#ifndef _AFL_H_#define _AFL_H_//from here to include all head files#include Log.h>#include原创 2008-04-08 13:27:00 · 2819 阅读 · 0 评论 -
template学习:一个Functor的使用例子
#include stdio.h>// 模板,可以调用函数或者Functortemplate typename Functor>void TestTemplate(Functor func)...{ func("TestTemplate");}// C函数风格void TestFunction(const char* str)...{ printf("TestFunction:%s原创 2008-01-12 18:52:00 · 616 阅读 · 0 评论 -
template中实现条件编译的补充:使用int2type技巧
先贴代码:#include stdio.h>template int v>struct Int2Type...{ enum ...{ value = v };};void func(Int2Typetrue>)...{ printf("true ");}void func(Int2Typefalse>)...{ printf("false ");}template原创 2008-01-09 22:49:00 · 721 阅读 · 0 评论 -
使用template实现条件编译
我们知道,使用宏可以实现条件编译:#if 1 //do something#else //do something else#endif 使用模板也能够达到类似的效果:#include stdio.h>template bool value>void func()...{ if (value) ...{ printf("t原创 2008-01-09 14:39:00 · 761 阅读 · 0 评论 -
小记:Linux下的堆破坏
今天遇见一个超郁闷的BUG,现象非常奇怪:delete pointer; 删除一个指针的时候程序发生core dump,或者在此处挂死。 从原理上分析,new出来的一块内存,会在内存的头或者尾处加上一个标记,说明块内存的大小。 我猜想,一定是指针越界,导致了开始或者末尾的这块标记被破坏,所以delete发生挂死。 检查了若干次后,也没发现指针越界的情况。 而且单独写了一个程序来原创 2008-01-05 19:40:00 · 673 阅读 · 1 评论 -
PRO*C++的批量绑定要注意的两个问题
PROC的批量操作的时候,与其绑定的数组变量要注意两个问题:1、如果是字符数组, eg: char UserName[1000][41]; 使用前先将数组的内容初始化成0x20, eg: memset(UserName, 0x20, sizeof(UserName)); 否则插入或更新的时候总有些记录出错。2、PROC不支持long long类型的绑定,使用double代替。强原创 2008-03-27 13:23:00 · 529 阅读 · 0 评论 -
小记:ICONV库,开源的编码转换工具
ICONV库是GNU提供的开源编码转换库,在LINUX下已经默认包含于系统中。对于开发者来说,已经存在/usr/include/iconv.h文件,链接时无需加入库名称。 在WINDOWS下需要下载库的安装程序:LibIconv for Windows库的网址为:http://gnuwin32.sourceforge.net/packages/libiconv.htm 程序库的安装程原创 2008-03-19 14:19:00 · 2573 阅读 · 1 评论 -
记一个原始套接字不能在同一网段发包的问题
最近编写一个原始套接字程序,自己构造IP包发送给对方,TCP和IP的校验和都计算正确了。测试的时候发现发送到不同网段成功,但是发送到同一网段却不行。 发送的代码大约是这样的:void Send(IP_HEADER* ip){ int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); assert(sock>0);原创 2007-05-31 09:49:00 · 860 阅读 · 0 评论 -
权威老了?《UNIX网络编程》一书中过时的地方
最近打算简单封装一下Linux下的socket函数,使之成为一个好用的类,参考书的蓝本选用了经典的《UNIX网络编程》。 在书中,作者提到,使用send()函数发送数据的时候,如果协议栈的发送缓冲区满了,send()函数将返回-1,并且errno为EINTR,这个时候应该重新调用send()继续发送。为了避免频繁地处理这种错误,作者自己写了个sendn函数代替send。 而查查原创 2007-08-22 21:21:00 · 1100 阅读 · 1 评论 -
复杂度为O(n)的取一组数中分布最密集的部分的算法
公司有一个检测系统,在单位时间内将每次检测结果保存。由于检测的环境受到外界干扰,会随机地出现异常值。以前的办法是:取得所有检测结果的最大值作为最终值。由于异常值的出现,导致检测结果非常不准确。于是思考在整个检测结果曲线中,取分布最密集的部分作为结果。(如果异常值大大多于正常值,且异常值的出现范围相同,则这种方法也不可靠。好在正常值是大多数) 算法实现的原理为:将N个数排序,从第一个原创 2007-03-09 16:00:00 · 1375 阅读 · 0 评论 -
提供一些C++文档生成工具Doxygen的资源地址
Doxygen真是个好东西,能够把你的注释生成漂亮的说明文档。对于类库开发人员,这可是个必备的好东西,大名鼎鼎的ACE的源码就是采用这个工具来生成说明文档的。 提供几个链接给大家: 首页:http://www.stack.nl/~dimitri/doxygen/ 二进制文件下载:http://ftp.stack.nl/pub/users/dimitri/doxyge原创 2007-03-06 10:11:00 · 848 阅读 · 1 评论 -
提供一个读取CAP文件的类
最近在做一些协议分析的工作,常常和ETHREAL打交道。 我写好自己的程序后,往往要放到真实的网络环境中去测试,看自己的协议处理程序是否正确。反反复复觉得很不爽。 于是考虑,如果可以把ETHREAL抓下来的数据直接作为测试数据使用,就方便多了。于是研究了一下CAP文件的格式(见上篇文章),自己写了一个读取CAP文件内容的类,公布给大家,希望能对你们有所用处。 具体的使用原创 2007-01-06 14:59:00 · 5366 阅读 · 7 评论 -
简单介绍windows平台下的pthread线程库
最近打算尝试写一些跨平台的程序,本想自己封装windows下的CreateThread和linux下的pthread,后来查查资料,发现Linux社区早就提供了windows下的pthread库,和linux下一模一样,爽。windows下的pthread库叫做:pthreads-win32,官方网站是:http://sourceware.org/pthreads-win32/,官方FTP原创 2006-08-24 13:50:00 · 5676 阅读 · 0 评论 -
LINUX学习笔记:遍历目录下的所有文件和文件夹
源码://ListFile.cpp#include stdio.h>#include dirent.h>#include sys/types.h>int main(int argc, char *argv[]){ if (2 != argc) { printf("Usage: ListFile SourceFolder "); return 1;原创 2006-08-12 11:31:00 · 4961 阅读 · 0 评论 -
在WINDOWS上编译LINUX的程序,注意:只编译不链接!
小弟刚学LINUX,用VI写起程序来实在很不顺手,于是还在WINDOWS上编码,编写好了再上传到LINUX服务器上,通过终端进行MAKE。在写一些基于标准库的 应用的时候,常常直接使用VC或者使用MinGW进行编译和链接,调试成功后在放到LINUX上测试,节省了不少时间。但是,编写一些与LINUX平台相关的代码就比较麻烦了。后来,偶然发现LINUX系统的头文件都在/usr/include/目录下。原创 2006-08-08 12:58:00 · 1772 阅读 · 1 评论 -
makefile原来是那么简单的东西,为啥教程都那么复杂呢?
小弟刚刚学LINUX 下的C/C++编程,同事告诉我要用makefile来编译 ,再问之如何写makefile时,答:makefile是很难的东西,你可以使用国外高手写的makefile来编译。 疑惑中,打开所谓高手的makefile,果然好长,果然看不懂。 不服气,到网上找一些makefile的教程,尽是些文件依赖、目标之类的理解不了的名次。 于是,谬论就这样在心中扎根了原创 2006-07-05 14:18:00 · 2054 阅读 · 4 评论 -
可在WINDOWS下使用的ORAPP类库(菜鸟级,无任何技术含量)
ORAPP是一个基于C++语言的封装了OCI函数的类库,比OCCI简单多了。 刚学习这个东西的时候,打算尝试在WINDOWS下写一些练习代码,后来发现ORAPP库是在LINUX下编写的,在WINDOWS无法编译通过。 于是我修改了一点点代码,主要是一些条件编译,以此达到可以在WINDOWS下使用的目的。 编译的时候需要修改make.bat文件,把ORACLE_HOME设置原创 2006-07-03 11:50:00 · 827 阅读 · 1 评论 -
有哪些手段可以优化快速排序算法
周五的下午面试了一位来自华为的高手,此高手称精通排序算法。我一听说某人精通某项,就忍不住兴奋,喜欢抓住别人最精通的这一项追根究底。一方面来说,问你最精通的东西,不能算考官故意刁难你;另一方面来说,面试别人往往成为自己变相请教高手的途径。 问之:相对于《数据结构》课本上提供的快速排序算法,有没有可以优化的余地? 本来我的原意是想听到他说将递归算法修改为非递归算法,可是聊了一些方面也原创 2007-07-07 17:02:00 · 1421 阅读 · 1 评论 -
小记:C/C++中的变长参数
我们知道可以在一个函数中定义参数个数不定的函数: void MyPrint(format, ...); 用三个点就行。 然而,一个宏函数中怎么使用参数个数不定的功能呢?有两个办法: #define MyPrint(format, args...) printf(format, args) #define MyPrint(format, ...) printf(forma原创 2007-07-16 17:20:00 · 641 阅读 · 0 评论 -
MinGW(windows下的GCC)的一个BUG:long long类型打印错误
在WINDOWS下使用MinGW调试程序的时候,发现一个GCC的BUG。请先看下面的代码:#include stdio.h>int main()...{ short a = 1; int b = 2; unsigned int c = 3; long long d = 4; unsigned long long e = 5; printf(" a原创 2007-08-23 10:17:00 · 1207 阅读 · 1 评论 -
C++template学习:基于数组的固定大小的锁无关的环形队列模版类
环形队列在只有一个入队线程和一个出队线程的情况下,是不需要使用锁的。此处的锁无关是只此种情况下,一个线程调用EnQueue,另一个线程调用DeQueue,不会发生冲突。文件:include/Queue.h#ifndef _QUEUE_H_#define _QUEUE_H_#include assert.h>namespace DataStructure...{templatetyp原创 2007-05-16 20:14:00 · 1983 阅读 · 1 评论 -
小记:函数模版作为类的友元函数的声明方法
假设有一个函数模版:template Type Max(Type& a, Type& b){ return a>b?a:b;} 现在要把这个函数模版作为一个类的友元:class MyClass{ template friend Type Max(Type& a, Type& b);}; 注意:friend 关键字应该写在template和函数声明之间。原创 2007-08-14 14:16:00 · 708 阅读 · 0 评论 -
C++学习笔记:编译器一定要知道类型的大小
假设在a.h文件中定义了一个结构体,然后在b.cpp中预先声明这个类型而又不引用头文件a.h,那么这个结构体可以使用吗?看看下面的例子: struct bb; //声明存在的一个类型struct aa{ bb b;};编译这个程序,GCC显示错误:field `b has incomplete type 稍稍修改一下这个文件:struct bb;原创 2007-05-16 19:54:00 · 800 阅读 · 0 评论 -
C++学习笔记:头文件互引用引起的编译器错误
如果有两个头文件:a.h和b.h,在a.h中引用b.h,然后在b.h中引用a.h。然后在一个c.cpp文件同时引用这两个头文件,编译c.cpp,哈哈,看见GCC就这样引用来引用去,CPU占了100%,进入了死循环。 一般情况下当然很容易检查出这样的问题,但是大项目中就可能存在头文件们绕了一个大圈,最后还是相互包含了的情况,编译器显示些奇怪的错误,根本无法从错误信息定位到原因。原创 2007-05-16 19:38:00 · 906 阅读 · 1 评论 -
欣喜的发现,超牛的MinGW
最近在用WinGW(GCC的WINDOWS版本)调试跨平台的C/C++程序,在链接程序的过程中,两次写错了链接的文件,一次是将.a的后缀误写为.lib,第二次是将.a的后缀误写为.dll,当时没发现,等到一天的工作结束了,躺在床上才想起这个问题。 为什么啊?链接的文件都写错了,链接应该不能通过的,为什么调试一天的程序都一切正常呢?难道MinGW可以与LIB文件和DLL文件直接链接?原创 2007-08-07 11:37:00 · 1658 阅读 · 2 评论 -
技巧:在pthread的线程函数中,使用类的非静态成员函数来执行
大家知道,pthread_create()函数的线程函数必须是静态的函数,以标准的__cdecl的方式调用的,而C++的成员函数是以__thiscall的方式调用的,相当于一个普通函数有一个默认的const ClassType* this参数。 为数据封装的需要,我常常把线程函数封装在一个类的内部,定义一个类的私有静态成员函数来作为pthread的线程函数,通常如下:clas原创 2007-08-05 21:12:00 · 2364 阅读 · 2 评论 -
小记:注意GCC链接中的库依赖,调整链接时库文件的顺序
GCC在链接过程中,对参数中的库的顺序是有要求的,参数右侧的库会先于左侧的库加载,也就是说参数的解析是从右往左的。 假设库B依赖与库A,则链接的时候要写为: gcc -o bin B A 如果写为: gcc -o bin A B 则在B中引用的A中的内容就会无法链接通过。原创 2007-08-01 14:03:00 · 1954 阅读 · 1 评论 -
template学习:实现一个类似多态的效果,来自WTL的一个技巧
多态都是在运行时实现的,C++中通过VPTR和VTABLE来提供运行时的动态调用;但是,VPTR和VTABLE的使用影响了性能。WTL中的一个技巧实现了类似多态的功能,并且不会影响性能。#include stdio.h>template typename SubClass>class Base...{public: void Run() ...{ SubC原创 2008-01-15 17:43:00 · 549 阅读 · 1 评论