摘要:
Socket编程基本API分析1.WORD类型分析WORD类型是一个16位的无符号整型,定义如下typedef unsigned short WORD;提供两个字节的存储,在Socket中这个两个字节可以分别用来表示主版本号和副版本号2.MAKEWORD宏WORD MAKEWORD(BYTE bLow, BYTE bHigh);将两个byte型合并成一个WORD型,一个在高8位,一个在低8位返回一个WORD变量3.WSADATA在WSAStarup()函数中作为一个返回值,存储这个函数加载的Socket的初始化信息把WSADATA的指针类型LPWSADA作为返回值传入WSAStarup(),t 阅读全文
摘要:
扩展的数组类型:1. 普通数组中,我们申请一连续的内存块,其中存放相同类型的数组元素,这样每个元素占用的内存相同,每个元素在数组中的偏移地址也可以通过一个等差公式计算出来,如:int array[10],这样元素的偏移地址依次为0,4,8…当知道起始地址array时,我们可以通过(array + 4*i)获得每个元素的地址,进而获得每个元素的值2. 扩展的数组类型中,我们申请一连续的内存块,其中存放不同类型的数组元素,这样每个元素占用的内存长度是不同的,每个元素在数组中的偏移地址也不再是一个等差的距离,通常我们使用扩展数组时,我们需要保存的数据的数据类型是已知的,我们统计好每个数据的数据名.. 阅读全文
摘要:
HGLOBAL是windows定义的数据类型,是一个句柄类型,表示一个内存块,这个内存块通过GlobalAlloc()函数分配,要通过GlobalLock()才能获得这个内存块的指针,最后需要GlobalUnlock()解锁这个内存块,通过GlobalFree()释放这个内存使这个指针无效,下面我们分别介绍这几个函数:1.HGLOBAL GlobalAlloc(UINT uFlags, DWORD dwBytes);功能:申请一块内存,第一个参数是分配的属性,第二个参数是分配的字节数返回:标示这块内存的句柄2.LPVOID GlobalLock(HGLOBAL hMem)功能:传入Global 阅读全文
摘要:
编写程序中我们常常需要对一个内存块的内容进行复制,有以下两个函数常常会用到,专门针对字符串的复制函数strcpy()/strcpy_s()和不针对具体的数据类型而仅仅复制一连续内存的memcpy()函数,这两个函数用法上有一些异同,下面我们分别进行分析:1.strcpy()用法char *strcpy(char *dest, const char *src);功能:从src地址开始的以'\0'结束符结束的字符串复制到以dest开始的地址空间返回:指向dest的指针#include <string.h>int main(void){ char string[80]; 阅读全文
摘要:
泛型算法的设计(2)前言: 前面我们讨论了一个泛型算法的实现思想,即设计一个算法,使其独立于所操作的容器,并且独立于所操作的元素类型,并分别用不同的机制实现了这两个目的,下面我们在算法设计中引入函数对象,实现算法独立于对元素的底层操作方式,这样我们实现了终极意义上的泛化,下面我们一步步的实现一个真正意义上的泛型算法。1.首先我们写一个函数,它可以找到vector内小于10的所有元素;vector<int> less_than_10(const vector<int> &vec){ vector<int> nvec; for(int ix=0; ix! 阅读全文
摘要:
函数对象(Function Objects)前言: 在前面讨论函数的弹性设计时,我们介绍了通过函数指针的方式来扩展函数的弹性,在此,基于同样的目的我们引入函数对象这个概念。1.定义: 函数对象顾名思义,是行为类似函数的对象;class absInt{ int operator() (int val){ return val<0 ? -val:val; }} 像世间万物一样,函数对象有共性也有个性,所有函数对象的共性是,都重载了调用操作符(如上所示),其个性是不同的函数对象定义了执行不同操作的调用操作符,如plus重载了执行+操作符的调用操作符,equal_to重载了执行==的调用操作符, 阅读全文
摘要:
泛型算法的设计(1)前言:泛型算法独立于操作的容器且与要操作的元素类型无关,达到了函数弹性设计的最大化,下面我们一步步的实现一个泛型算法;1.有一天,老板交给你一个任务,要你编程完成如下工作,给定一个存储整数的vector,及一个整数,如果此值存在于vector内,我们必须返回一个指针指向该值;反之则返回0,表示此值不在vector内;int find(const vector<int> &vec, int value){ for(int ix=0;ix!=vec.size(); ++ix) if(vec[ix]==value) return &vec[ix]; r 阅读全文
摘要:
函数的弹性设计前言: 实现函数的泛化及功能的弹性收缩是代码重用的技术基础也是编程人员应该有的编程思想,C++在语言范畴上也有很多支持其的机制。我们初窥编程时,当针对一个数据进行特定处理时,我们根据处理的流程在main函数的相应位置添相应的处理,当下一次需要对一个相同类型的另一数据处理时,我们在相应的置添加同样的代码用于处理,随着处理次数的增加,我们选择将这个功能抽象出来,这样我们就可以设计出一个对特定数据实现特定操作的函数,用于调用,从使代码更简洁,更易于理解。 随着程序设计的深入,我们常常面对例如对另一种数据类型进行相同的处理或对多种数据进行类似的处理,我们也希望将此类问题抽象出来实现进一步 阅读全文
摘要:
设置默认形参增加函数的弹性函数1:void display(const vector<int> &ivec){for(int ix=0;ix!=ivec.size();++ix)cout<<ivec[ix]<<" ";}分析:此函数非常霸道的将输出绑定到cout对象上,只能输出到屏幕上;改进:通过给函数添加ostream参数,可选择输出到屏幕上还是文件中,设置其默认值为cout,表明默认输出至屏幕上;void display(const vector<int> &ivec,ostream &os=cou 阅读全文
摘要:
动态内存管理1.堆内存(heap memory):程序自由空间,此种内存必须由程序员自行管理,其配置有new表达式达成,释放有delete表达式完成;2.配置heap内存的方式: int *pi=new int(1024); int *pia=new int[24]; 注: C++中没有提供任何语法让我们得以从heap配置数组的同时为其元素设定初值;3.heap配置而来的对象,皆是未经过初始化的;4.heap配置而来的对象执行期通过new配置而来,直到以delete表达式加以释放为止(heap 配置对象的生存期);5.delete 释放heap配置的内存时,无需检验pi是否为零,编译器会自动为 阅读全文