随笔分类 - C/C++
摘要:重温数据结构——图的遍历 首先,我很想说的是,最近这两天寝室里的蚊子,有点多,有点犀利~每天早上起来都要被叮上几个包,有点苦逼。 另外今天还玩了几把dota2,感觉画面质量是很不错的,但是,手感和dota不一样,而且我的笔记本配置很一般~ 接下来讲今天看的数据结构——图~ 我上个学期在上海泰瑞达的春季招聘中曾被考过这类问题。前面有一题是多态和另外一个名词的解释,有点记不清了。然后还有一道题考的是括号解析,这个很简单的,用栈就能直接处理。然后后面就是连续的两个图的问题。之前好像只是简单的看了看源代码,对于什么是深度优先遍历和广度优先遍历稍微有点认识吧。结果自然是可想而知,比较惨的。当时我在卷子上
阅读全文
摘要:LANChat工作整理2013/8/22程序实现功能: 局域网聊天软件,启动即可找到在线设备,并能够进行简单的文字聊天。 其实下面这个框图已经说明了程序的绝大部分功能原理。核心类的程序框图我觉得,这个程序中使用的最好的技术,应该就是IOCP了。后面我会针对IOCP好好地写一篇博文,这个技术虽然刚学的时候有点乱,但是确实很好用。 上面的框图中中间的UDPServer线程等待的事件完成是MainServer线程在Listen函数调用结束后设置的事件。这里忘了标了。说明 前几天在实验室看《Windows网络与通信程序设计》这本书,看完了前5章吧,就觉得目前手头的技术去做一个局域网聊天软件应该差不多了
阅读全文
摘要:每次提起快排,内心中都有点隐隐作痛。当时腾讯的那个面试官让我写快排的前两遍排序结果,结果,我当时居然没写上来……这个,就是所谓的关键时刻掉链子吧,这么经典的快排都不会,真是丢死人了……今天在实验室的时候我第三次不借助任何资料,根据快排思想,写出了快排的程序~先看看我第二次的那篇文章,第一次完成的已经不知道被我丢哪里去了~ 1 void qsort(int * array, int length) 2 { 3 if(length = KeyWord && j > i)11 -- j;12 swap(array[j], array[i]);13 ...
阅读全文
摘要:还是在重温C++,看到extern的意思,觉得很有必要记下来。extern是用来干什么的大家想必都是很明白的。如果有个全局变量,或者其他文件的全局变量,要在本文件或函数中使用,可以通过extern来声明一个一模一样的本地变量来使用这个全局变量。说的有点够绕嘴的。书上直接给出了其意思,非常准确,太有必要记下来了,以前都没注意。其意思是这样的:“通过以前被外部定义的名称使用该变量”太经典了~
阅读全文
摘要:这个问题是C++模板中的一个特性,像这个修改便可编译通过:template inline const typename Queue::QueuePoint1 & Queue::QueuePoint1::operator = (const Queue::QueueItem*p)解释一下就是,“依赖受限名称不能作为类型使用,除非在前面加上 typename关键字”。依赖名称:含有模板类型参数受限名称:含有“::”符号你的这个 Queue::QueuePoint1 就是个典型,必须加typename关键字,编译器才能识别的。
阅读全文
摘要:今晚闲来无事,写篇博文聊解解闷~CEdit这个空间类,我之前倒是用过,不过那个时候用的还比较菜,现在么,依旧比较菜~首先,因为我今天刚做完了一个局域网聊天软件,用的就是CEdit来显示和获取数据的。最近实验室没网了,所以我在寝室的时候上网随手粘了几篇文章到U盘后就直奔实验室了。没网还去实验室,是因为在实验的局域网能让我联机调试,我室友用电脑看考研辅导视频。说了好多废话~1 获取CEdit对象中的数据:设对象为m_RecvEdit。先使用其成员函数GetLineCount,获取到对话框中文本的行数。然后做一个for循环,在其中使用其成员函数GetLine获取对应行中的文本。文本框中的数据存储可以
阅读全文
摘要:今天因为需要把一个winsock代码封装到C++类中,但是在过程中,遇到了不少问题,都是我以前知道的,但是忘了的。今天专门好好地写一篇博文,免得以后忘了还要百度。首先我原来的程序主动创建了3个线程,算上main,一共是4个线程。封装为C++类后,因为不能因创建的对象而阻塞原程序,所以在需要创建一个替代main的主线程。这样就是4个线程了,其中2个线程用的是同一个函数。而且这四个线程我只想让我的对象用,对外部应该是不可见的,所以,要封装到类里面。我前面的一篇博文也说了,类中的函数若想成为线程函数,则必须为静态成员函数。原因就是静态成员函数没有this指针。这样,类中就要有3个静态成员函数了。C+
阅读全文
摘要:五子棋工作文档1说明: 这个程序在创建初期的时候是有一个写的比较乱的文档的,但是很可惜回学校的时候没有带回来……所以现在赶紧整理一下,不然再过一段时间就忘干净了。 最初这个程序是受老同学所托做的,一开始的时候要求要人人对战和人机对战,但是大家都很明白,所谓的人人对战就是简单那的GDI绘图罢了,那些基础函数用好了自然没问题。而人机对战则需要一定的棋盘分析能力,做起来还是很复杂的。当时受时间限制,第一个版本是我用了两天时间做的一个人人对战,直接就给她发过去了,用来应付她的实习,因为我当时也不确定人机对战能不能做出来。不过之后我一直在做,毕竟之前没做过,算是一次尝试。之后貌似过了9天吧,才完成了核心
阅读全文
摘要:这个最初是在microsoft的《编程之美》中看到的,用你的程序来控制CPU的使用率。首先是要求写一个用来实现CPU使用率为50%程序。这个还是很好实现的,只要让你的程序忙的时间课空闲时间对半就可以了。这里主要要用到两个函数:GetTickCount以及Sleep。GetTickCount函数据我所知在2000版的msdn中是查不到的,不过功能很简单,就是返回系统启动到现在所经历的毫秒数。有了这个函数,就能够较为准确的获得一个程序运行时间,来控制程序的睡眠时间。这个是实际效果图:这个图片的效果就比较惨了,这个程序是我用来画CPU正弦曲线,看这个图片依稀能看出来点正弦的意思……在家里的计算机画的
阅读全文
摘要:首先说下虚拟列表出现的原因:数据量比较小的时候,对于CListView控件可以直接使用InsertItem并配合SetItemText函数来插入并修改数据。这样操作很直接。但是,如果数据量比较大了,比如1w个数据,那么,根据插入的数据种类,长度,以及计算机性能,估计时间在10s中到1分钟不等。如果你的用户在使用的这样的程序时肯定不会开心,初始化的时候插入则需要登上10s+后才能使用,如果外加一个线程来并行插入,倒也是一个方法(这个事情我做过),不过,很浪费CPU时间,以及内存。如果是10w个,甚至100w个数据呢?那么至少会线性的增加时间了~但是回头想一想,一个列表,在你的计算机显示器上,最多
阅读全文
摘要:回顾:刚刚写完,因为是分期写的,所以最初想好好做一下的文章格式半途而废了~说的也许会有点啰嗦,但是所有的基础用到的技术细节应该都用到了。如果还有什么疑问,请回复留言,我会尽力解答。如果有错误,请指正。这里所有使用到的内容在VS2010中均能正常运行。可运行程序的截图:CListCtrl控件的创建如果一个CListCtrl控件对象和dialog上的控件已经绑定,那么可以跳过这个这一步,因为绑定了的对象已经完成了创建。但是如果要在dialog上凭空创建出来一个列表控件,那么就需要了解CListCtrl类的成员函数:Create先看这个函数的原型:BOOL Create( DWORD dwStyle
阅读全文
摘要:这个我一直都很想做了,前两天开始准备,查找了一下CFindFile的资料,然后把思路理清楚,就直接开始做了。文件系统是一个操作系统以一部分,所以想文件操作,基本上就要依赖于操作系统提供的接口函数。在这我是直接用windows中对文件查找专门做好了的一个类来实现文件的遍历。其实一个文件目录就是一个树,每一层目录都有很多的子目录和文件,当成节点就好了。在使用CFindFile遍历的时候,需要先调用FindFile函数,再调用FindNextFile函数来遍历当前这一级的目录。我为了输出方便使用了控制台工程,在这里需要提示一点:由于windows程序设计中默认使用unicode编码,所以在使用控制台
阅读全文
摘要:之前腾讯实习生面试之行中面试官曾问过这个问题,不过他上来之后先问的是:你知不知道单件类?然后我摇了摇头:不知道。刚才在看C++ primer plus的时候,还真的看到了C++中单件类的实现。其实方法也还是挺简单的:目的很简单,就会要一个类只能创建一个实例,也就是只有一个对象。我之前的想法是在类中添加一个静态成员来计数,然后呢,通过计数来控制对象的创建。但是,我现在想想,觉得这个想法还真的是挺幼稚的。用了静态成员,第一次对计数的查看是在什么地方?构造函数。但是很明显的是,构造函数创建的时候,这个对象已经生成了。也许可以把这个类的内部数据全部都变成无效值,但是终究还是创建了两个对象。书上提供了一
阅读全文
摘要:最近刚开始看DX,刚才刚刚把环境搭建好。具体步骤是这样的:首先,你要下载一个DX的SDK安装包,把sdk装到你的计算机上,不必非要装在C盘。假设在vs2010下,创建一个window32工程。然后对这个win32工程进行配置。主要有一下几个地方:在工程属性窗口中,就是VC++ directory下有这样的几个路径要配置好:include directorylibrary directorysource directory这些对应的文件夹路径都是在所安装的sdk目录下能找到的,选中文件夹包含进去就可以了。然后还有一个需要配置的就是linker,这个主要是在input选项中添加三个链接库分别是:d
阅读全文
摘要:大家都知道,有时候后需要动态建立一个数组,一位数组还好说,但是如果是二维数组则稍显麻烦一些。在VC中,一般位图的数据传输都是通过一个DWORD指针加上长宽共三个数据进行传输的,这样的缺点就是在代码里需要加点控制,而且在调试的时候比较容易溢出导致程序崩溃。但是能用好还是很不错的。最近在学习图论的遍历,这里就涉及到要先建立一个图。我首先想试验的遍历方法是深度优先遍历,所以觉得用邻接矩阵法好一点。如果我直接用上面的方法,或许就没那么多波折了。我用的是vector。这个在一维的时候相当好用,绝对是我见过的最好用的几种容器之一了。但是涉及到二维的时候,就出现了一点的麻烦。因为最外围的vector成员是v
阅读全文
摘要:这个是昨天写的,但是今天才整理并贴出来~是这样的,C中的常识之一就是,const类型的值是不可修改的。但是我昨天在看书的时候想到所有位于内存中的数据其实都是可以修改的,就用代码尝试了一下,代码如下:#include <iostream>using namespace std;int main(){ cout << "Hello world!" << endl; const int a = 10, b = 20; int c; int * np = (int *)&a; *np = 9; *(np + 1) = 19; c = a;
阅读全文
摘要:在学校的论坛上看到有人出这样的一个问题:自然数的平方数为1 4 9 16 25……自然数的立方数为1 8 27 64 256……自然数的四次方为1 16 81 256……这些数字都可以成为次方数。在1到10000中,现在写一个C程序,去掉所有的次方数,问还剩多少个数字?这个问题我想了一下,觉得有点麻烦,如果单纯的把数字算出来,然后再统计,再除去重复值,估计效率不高,而且代码写起来比较麻烦。思路是这样的:创建一个vector,然后计算次方数,每算出一个次方数,就到vector中查询,如果里面没有,那么就添加进去,并且对次方数的计数+1。直到所有的次方数都被算出来,然后用10000- 次方数的个数
阅读全文
摘要:今天在上机的时候尝试着去画一个图像。当时的想法是先创建一个内存DC,先在内存DC上绘图,然后再用bitblt函数将其拷贝到桌面DC上。代码很简单,先这样:CDC memDC;memDC.CreateCompatibleDC(pDC);……pDC->BitBlt(……);后面的相比你都明白的,但是在memDC上的绘图始终在pDC上看不到。回来之后再好好的看了看才发现,想在memDC上绘图并有效,必须还要创建一个兼容位图加选进去,才能绘图……坑死了~选中之后,果然就好使了……
阅读全文
摘要:刚才在看串口数据的接收问题。这里的话,最开始的时候需要在打开串口后,对串口使用SetCommEvent函数去设置通知事件。这里又涉及一个问题,就是一般SetCommEvent函数的第二个事件参数为EV_RXCHAR第一个参数不用想了,就是文件句柄。响应这个事件的函数是:WaitCommEvent在一个已经完成了的串口类中,也是调用这个函数去响应消息的,而且在后台线程函数中,这个函数同时调用了两个时间等待函数。第一个等待事件响应的就是这个函数,第二个则是著名的waitmultipleobjects函数。然后在其代码注释中,那位大神说这个函数在调用之后不会持续等待,而是立刻返回,原因就是这个串口是
阅读全文
摘要:还是写那个串口调试助手出现的问题。这个函数原型如下:DWORD WaitForMultipleObjects( DWORD nCount, // number of handles in array CONST HANDLE*lpHandles, // object-handle array BOOL fWaitAll, // wait option DWORD dwMilliseconds // time-out interval);第一个参数就是句柄数组的成员数。第二个参数是句柄数组的地址第三个是一个等待选项,就是在这出的问...
阅读全文