摘要: 4 标准转换1、标准转换是为内置类型定义的隐式转换。标准转换序列是按以下顺序定义的标转转换过程: ——零或一次以下转换:左值到右值的转换,数组到指针的转换,函数到指针的转换。 ——零或一次以下转换:整型提升,符点提升,整型转换,符点转换,符点-整型转换,指针转换,成员指针转换,和布尔转换。——零或一次限定转换。[注意:标准转换序列可能为空,也就是说,可以不包含转换。] 如果需要,标准转换序列将作用于表达式并将它转换为目的类型。2、[注意:特定类型的表达式将在以下上下文中转换为其他类型: ——被用作操作符的操作数。操作符对操作数的要求规定了目标类型。 ——被用于if语句或重复语句(6.4, 6. 阅读全文
posted @ 2006-03-22 13:29 Goncely 阅读(364) 评论(0) 推荐(0) 编辑
摘要: 在C++语言中,我们是应该存储对象本身还是对象的指针呢?储存指针就一定比对象本身节约空间和高效吗?最近在做一个程序,程序要求访问大量的字符串,在程序中每个相同的字符串只有一个唯一的副本。我构造了一个类KCStringManager,其中的方法LPCTSTR GetString(LPCTSTR lpszName)用于返回储存在Hash表中的字符串指针,这个字符串等于lpszName,由此保证每个字符串指针的唯一性。这样带来的好处是:首先节省了空间;其次,后期字符串的比较工作非常高效,只需要比较它们的指针是否指向同一个地址。这正是很多编译器所使用的方法。另外,我还构造了一个KSymbol类,其中包 阅读全文
posted @ 2006-03-21 09:37 Goncely 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 无法根据左递归文法编写出递归下降分析器,因而把左递归文法等价变换为非左递归文法至关重要,以下是变换的算法:1、消除直接左递归原文法: E --> E a1 | E a2 | ... | E an | b1 | b2 | ... | bn消除后: E --> b1 E' | b2 E' | ... | bn E' E'--> a1 E' | a2 E' | ... | an E' | epsilon2、消除间接左递归a) 把所有非终结符号按一定序列排序为E1, E2, ... En;b) for i=1to ndo /*依 阅读全文
posted @ 2006-03-17 17:37 Goncely 阅读(509) 评论(0) 推荐(0) 编辑
摘要: 在C语言中,经常有如下的用法:typedef struct tag{ ...} MyType, *MyPtr;一旦通过如上定以后,就可以用MyType来定义struct tag结构了。以前我使用typedef的时候,是按照其字面意思理解的,所以进入了一个误区。比如说我想定义MyInt为int类型,我用的代码如下:typedef MyInt int;我把上述代码理解为:定义MyInt类型为int。一切好像都是顺其自然的事情,但编译的时候才知道错误。其实,在C语言中声明变量的时候,有个存储类型指示符(storage-class-specifier),它包括我们熟悉的externstaticauto 阅读全文
posted @ 2006-03-16 16:48 Goncely 阅读(446) 评论(0) 推荐(0) 编辑
摘要: 在C++中重载new和delete操作符可以给程序带来更灵活的存储控制,对于游戏设计等对效率要求较高的应用而言是必不可少的。一般的C++书籍中也会介绍它们的应用和实现,然而在VC中实现却有几个必须注意的地方,否则编译会出现问题。1. 实现首先,vc在每个自动生成的cpp文件中都会加入如下代码:#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif从上面红色的字体可以看出,这时的new在debug模式下被定义成了DEBUG_NEW,所以实现new函数的代码应该放在此定义之前 阅读全文
posted @ 2006-03-15 09:56 Goncely 阅读(862) 评论(0) 推荐(0) 编辑
摘要: 以前在windows下总喜欢使用CFile类来操作文件,最近改用fopen系列函数,却没想到一个不经意的问题让我调试了一整天。打开文件使用的代码如下:FILE* fh = fopen("c:/filename", "r");缺省情况下(当然可以进行设置),文件是以文本模式打开的,因为我们没有使用b标记。这个时候,如果文件数据中含有0x1a就有麻烦了。每当读到0x1a的时候,文件的位置会跳到4096(ftell返回的结果),如果文件小于4096字节的话,那么调用fgetc得到的结果是EOF。另外,ftell返回的结果也和文件的物理位置不一致,这使得我们在不 阅读全文
posted @ 2006-03-10 17:15 Goncely 阅读(419) 评论(0) 推荐(0) 编辑
摘要: 1 引言对前缀编码进行解码时,最重要的问题是如何快速的确定码字的长度。范式哈夫曼编码具有数字序列属性,因而能通过如下算法确定码字的长度:int len = 1;int code = bs.ReadBit();while(code >= first[len]){ code <<= 1; code |= (bs.ReadBit()); // append next input bit to code len++;}len--;另一方面,上述算法逐位进行操作,因而效率不高。快速解码算法的开发便是针对上述两个速度瓶颈而进行的。1 一个小的改进[1]首先看一个定理:对于任意的两个规范哈 阅读全文
posted @ 2006-03-09 14:14 Goncely 阅读(832) 评论(0) 推荐(0) 编辑
摘要: 1 概念介绍哈夫曼编码是一种最优的前缀编码技术,然而其存在的不足却制约了它的直接应用。首先,其解码时间为O(lavg), 其中lavg为码字的平均长度;其次,更为最重要的是,解码器需要知道哈夫曼编码树的结构,因而编码器必须为解码器保存或传输哈夫曼编码树。对于小量数据的压缩而言,这是很大的开销。因而,应用哈夫曼编码的关键是如何降低哈夫曼编码树的存储空间。Faller[1973]提出的自适应哈夫曼编码技术使哈夫曼编码树的存储空间降为零,即在使用某种约定的情况下,解码器能动态地重构出和编码器同步的哈夫曼编码树,而不需要任何附加数据。这样做的代价便是时间开销的增大。另一种技术是编码器和解码器使用事先约 阅读全文
posted @ 2006-03-06 11:02 Goncely 阅读(836) 评论(0) 推荐(0) 编辑
摘要: 1、远程数据库设远程数据库的ip地址为192.168.0.1,其中testdb数据库中有student表,student表包含两列:name和age。name为char类型,长度为10;age为int类型,长度为4。2、源代码HENV hEnv = NULL; // Env Handle from SQLAllocEnv()HDBC hDBC = NULL; // Connection handleRETCODE retcode;// Allocate memory for ODBC Environment handleSQLAllocEnv (&hEnv);// Allocate m 阅读全文
posted @ 2006-03-01 13:52 Goncely 阅读(353) 评论(0) 推荐(0) 编辑
摘要: 1 引言前段时间做了一个基于IPFILTERDRIVER的ip过滤驱动,使用了一段时间却出现了不少问题:1、首先,IPFILTERDRIVER只能挂接一个驱动。也就是说,如果其他的驱动先挂接了IPFILTERDRIVER,那么我们的安装将失败;2、其次,有的2000pro系统下居然缺少IPFILTERDRIVER驱动组件;3、最后,某些系统会出现997错误,即“重叠IO操作正在进行”。基于上述问题,重新实现了一个Tcp设备的过滤驱动程序TcpFilter,使用它来拦截ip访问操作。2 过滤驱动程序在2000以上的系统中,都实现了一个Tcp设备"//Device//Tcp", 阅读全文
posted @ 2006-02-24 14:27 Goncely 阅读(549) 评论(0) 推荐(0) 编辑