![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C_C++
文章平均质量分 79
comwise
这个作者很懒,什么都没留下…
展开
-
yate编译之一
操作系统win7 64 vs2008 1、首先下载yate 最新源代码 地址 http://docs.yate.ro/wiki/Download 这里我选择windows版本可以使用svn下载 svn checkout http://voip.null.ro/svn/yate/trunk web版本的svn地址 WebSVN http://yat原创 2016-09-17 13:14:48 · 1897 阅读 · 0 评论 -
深入分析MFC消息映射
在MFC生成的类中,我们会发现几处使用宏的地方,如下DECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP(CMFCHelloDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON()END_MESSAGE_MAP()这里就是提供消息循环的地方,这里可以避免使用冗长的虚表,因为如果每个类对他可能接收的消息都有一个虚函数,那么就需要过多的虚表,占用较多的内存空间。而原创 2013-11-27 21:21:59 · 2149 阅读 · 0 评论 -
深入分析MFC之GDI原理透析
为什么会使用GDI呢?首先要理解一般显示器,是将要显示的内容存放在显存中,framebuffer就是用来存储显示的数据,由DMA自动读取数据将其显示在窗口中,而这里显示的只是一个个的像素点。通常是先显示一行的像素点,发出水平同步信号后,再显示下一行,当整个一屏幕的数据显示完全后,才会发出垂直同步信号,发出下一帧数据。注意这里。。。MFC如何使用GDI?首先对于GDI而言,他并不是将图像直接显示在设备上,而是将显示的数据首先绘制在一个设备描述表DC中,这里面存储了显示图像的描述字段,包括物理设备和各种状原创 2013-12-06 16:01:45 · 4174 阅读 · 0 评论 -
MFC之消息传递(A->B->C, C为主窗口且没有启动)
情况一:你希望启动一个进程A,如果希望在进程A中再启动B,并暂停当前进程A直到进程B进程结束返回,就可以调用::WaitForSingleObject函数,注意:Linux内核其实也提供了类似的函数可以执行进程A的同时创建B,并且以不同的顺序执行 STARTUPINFO si; ::ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = si原创 2013-10-23 17:02:55 · 1355 阅读 · 0 评论 -
C++复制构造函数
复制构造函数、赋值操作符、析构函数总称为复制控制复制构造函数定义:是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用用于的情况:1)初始化对象 ,根据另一个同类型的对象显式或隐式初始化它复制对象2)作为实参传给函数时,复制这个对象3)函数返回时,复制对象4)初始化顺序容器中的元素5)根据元素初始化列表初始化数组元素1. 对象的定义原创 2014-02-17 13:45:09 · 961 阅读 · 0 评论 -
虚函数与动态绑定的那点事
面向对象编程的概念1)多态:简单理解就是多种形态,通过继承而相关联的类型,特别在运行的情况下,对象可能是基类也可能派生类类型1)继承:能够对类型之间的关系建模,共享公共的东西,仅仅特化本质上不同的东西。定义为virtual的函数是基类期待派生类重新定义的,基类不希望派生类继承的则定义为非虚函数,这样类就有虚函数与非虚函数之分2)动态绑定:使程序使用继承层次中任意类型的对象,无需关心具体的类型。在C++,通过引用或者指针调用虚函数,发生动态绑定,引用或指针既可以指向基类对象也可以指向派生类原创 2014-02-27 14:10:44 · 2984 阅读 · 1 评论 -
消息处理实例解说
Message处理消息,Folder存放Message消息,一个Message消息可以放入多个文件夹Folder,一个Folder可以存放多个Message按照此种方式设置了Message类插入消息,移除消息,将消息放入所有文件夹,移除所有文件夹中的消息,Folder类存放消息,移除消息class Folder;class Message{public: Message(const原创 2014-02-19 16:02:13 · 1135 阅读 · 0 评论 -
如何使用Windows API获取IP、MAC
这里用的两个函数:gethostbyname/gethostbyaddr,GetAdaptersInfo,这里主要通过获取IP看链表的操作,如下获取所有IP地址的函数,如下:int CIPInfo::GetIPInfo(const char * szHostName){ char szHost[HOST_NAME_MAX]; HOSTENT* pHost; char* szIPAddr = NULL;原创 2013-12-29 16:18:08 · 3807 阅读 · 0 评论 -
服务器IO模型之Select
阻塞与非阻塞:widows下创建套接字默认都是阻塞型的,阻塞型的好处是处理简单,理解容易,但是处理多个套接字时,就必须创建多个线程,即一个连接socket使用一个线程。而非阻塞模式比如在处理发送和接收数据时,会立即返回,不管是否有有效的数据,这就需要不断测试返回代码,来确定套接字在什么时候可读/可写,也就是确定网络事件何时发生,比如中断默认就是一种事件触发型,比如菜单按钮也是事件触发性,但原创 2014-01-09 23:04:41 · 1590 阅读 · 0 评论 -
你所不知道的 const
1. const对象的初始化 const 常量是不可修改的,也就是说only read,例如const int nBuffSize = 512;nBuffSize = 0; //error 就是因为const 常量不能修改,所以定义时必须初始化2. const对象的文件局部性默认在全局作用域中定义的非const变量可以在整个程序中访问,例如//file1.cint nC原创 2014-01-14 10:40:48 · 1153 阅读 · 0 评论 -
C++构造函数
C++中构造函数是特殊的成员函数,只要定义类的新对象就会执行构造函数,构造函数是保证每个对象的数据成员具有合适的初始值。构造函数特点:1)构造函数与类同名,不能指定返回类型,且不能声明为const函数,详见const的使用2)构造函数可以重载,所以可以有多个构造函数 sales_item(void) /*const*/; sales_item(istream &is /*= ci原创 2014-02-13 15:43:25 · 952 阅读 · 0 评论 -
冒泡算法的改进
冒泡排序算法的思想:首先将第一个记录的关键字和第二个关键字进行比较,若为逆序则将两个记录进行交换。然后比较第二个记录和第三个记录的关键字,直至第n-1个记录和第n个记录进行比较为止,一趟过后最大的元素会沉入最底部。然后进行第二趟排序,对前 n-1 个记录进行同样1、2的操作,结果就是关键字次大的记录被安排到n-1位置上。依次进行第 i 趟排序,对前 n-i 个记原创 2013-12-20 23:03:40 · 1548 阅读 · 0 评论 -
C++赋值操作符与析构函数
赋值操作符的定义:1)赋值操作符,就是常用变量赋值的“=”,将一个玩意赋值给另一个玩意2)默认形式:classType & operator=(const classType &);operator后面紧跟要重载的操作符就是操作符重载的默认形式;形参是本类类型的引用,默认第一个形参就是类类型对象自己的指针this;返回类型就是类类型的引用合成赋值操作符:合成赋值操作符也是采用原创 2014-02-18 16:44:46 · 1209 阅读 · 0 评论 -
VC/MFC开发中的句柄HWND
Windows开发中,经常会碰到一个常见的字眼HWND,如下 HWND hWnd; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);HW原创 2014-05-01 12:42:26 · 5217 阅读 · 0 评论 -
深入分析MFC启动流程
精简以上代码,就会发现其实是一样的1.初始化主框架,保存参数 : if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))2.初始化文档管理器:pApp->InitApplication()3.初始化窗口: if (!pThread->InitInstance())由于InitInstance()是虚函数,会调用子类重写的此函数 ,就是这个函数BOOL CMFCHelloApp::InitInstance(),在这个原创 2013-11-27 15:59:29 · 3399 阅读 · 0 评论 -
设计模式之桥接与工厂模式
设计模块中的桥接模块和工厂模式的使用说明原创 2015-11-13 00:14:36 · 1007 阅读 · 0 评论 -
C++消息分发模块框架的构想
消息分发,采用接口暴露和独立的风格,使用者只需要注册或者继承即可,每一个模块都可以单独接收消息原创 2016-04-14 09:13:10 · 4322 阅读 · 0 评论 -
闹钟程序的设计
@brief : alarm clock and alarm timer@author : comwise @note : timer, you must set correct begin time原创 2016-08-16 13:21:05 · 1390 阅读 · 0 评论 -
C++线程安全队列
templateclass concurrent_queue{private: std::queue the_queue; mutable boost::mutex the_mutex; boost::condition_variable the_condition_variable;public: void push(Data cons原创 2016-05-31 13:25:30 · 3238 阅读 · 0 评论 -
C++队列模板使用std::queue
#ifndef _TASK_QUEUE_H_#define _TASK_QUEUE_H_#include #include #include templateclass TaskQueue {public: TaskQueue(){ queue_.clear(); } virtual ~TaskQueue(原创 2016-05-31 13:24:33 · 4987 阅读 · 0 评论 -
Qt QTableWidget的使用方式
//QTableWidget行选中/删除/添加行//1 均分各列 tableWidget->horizontalHeader()->setStretchLastSection(true); //就是这个地方 tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch); //2 整行选中:job_原创 2016-05-31 13:21:55 · 14154 阅读 · 0 评论 -
设计模式之命令模式(Command)
#pragma once#include #include #include //暴露接口层class Command{public: virtual ~Command(void); virtual bool execute() = 0;protected: Command();};//简单命令类,便于不同对象的创建原创 2016-04-14 10:19:06 · 518 阅读 · 0 评论 -
皮肤的Xml配置文件
-->原创 2015-03-06 19:49:14 · 1090 阅读 · 0 评论 -
动态链接库DLL
概述:动态链接库通常不能直接运行,也不能接受消息。他们是一些独立的文件,其中包括可被执行程序或者其他DLL调用来完成某项工作的函数。WINAPI提供的3个重要DLL:Kernel32.dll:包含管理内存,进程和线程的函数User32.dll:包含那些用于执行用户界面的任务的函数,如窗口的创建和消息的发送GDI32.dll:包含那些用于画图和显示文本的函数静态库与动态库原创 2014-03-23 11:18:47 · 1481 阅读 · 0 评论 -
VC/MFC中如何替换自带滚动条控件的图片
Replace a Window's Internal Scrollbar with a customdraw scrollbar Controlflyhigh,17 Jun 2007 CPOL 4.40 (49 votes)1234转载 2014-11-07 23:48:09 · 2477 阅读 · 0 评论 -
XScrollBar - Scroll bar like Windows Media Player's
XScrollBar - Scroll bar like Windows Media Player'sXScrollBar is a scroll bar that may be displayed with optional thumb color, thumb gripper, and channel colorDownload demo project - 8转载 2014-11-08 00:13:31 · 1471 阅读 · 0 评论 -
STL之关联容器(pair、map、set的使用)
1.关联容器与顺序容器的对比1)关联容器是通过键存储和读取元素,而顺序容器则是通过元素在容器中的位置顺序存储和访问元素2)物理存储方式:一般关联容器是非连续内存存储,而顺序容器一部分是连续存储在内存中,随机访问速度较快,如vector、deque关联容器一般包括map、set两种基本的关联容器:【map】关联数组,元素通过键来存储和读取;适用于需要存储/修改每个键所关联的值的情原创 2014-03-02 21:21:38 · 3685 阅读 · 1 评论 -
Linux内核之 “typedef int (init_fnc_t) (void);”
我们通常情况下会如下使用 typedef :typedef int MyInt;MyInt a;这个时候我们的MyInt 就和int是一样的意思。而对于函数的申明我们通常会这样申明:int InitFunction() (void);此时表示申明了一个函数名为InitFunction的函数, 函数没有任何的形参,返回值类型为int型。而对于 typedef int(in转载 2013-06-30 00:41:11 · 1264 阅读 · 0 评论 -
调用操作符和函数对象
引言什么是调用操作符和函数对象呢?就是调用操作符看起来像是调用函数,如下设计的一个类,是用来求一个整数的绝对值的,如下类struct absInt{ int operator()(int a) { return (a < 0)? -a: a; }};如下调用 int nVal = -1234; absInt abs; int nPosVal = abs.o原创 2014-02-25 22:46:16 · 1189 阅读 · 0 评论 -
__stdcall、__cdecl、CALLBACK、WINAPI区别
先看下windows下的使用:LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);这里就有一个CALLBACK,转到定义看一下#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)#define CALLBACK __stdcall#define WINAPI原创 2014-05-01 12:10:26 · 3129 阅读 · 0 评论 -
void * 与 空指针NULL
3:释放指针 1)若p是一个值为NULL的空指针,且p是动态分配的,则delete p是合法的,但没有任何意义。 2)通常delete p之后,p就变成了未定义,以后都不可以再使用p了,但有些机器将p指向的地址仍然保留,但p所指向的内存已释放,成为悬垂指针,因此释放指针p之后,要将p=NULL,这样p就变成未指向任何对象的指针了。原创 2013-06-30 00:42:49 · 1093 阅读 · 0 评论 -
顺序存储的栈
栈定义:仅限在表尾进行插入和删除的线性表栈的特点:1)一般来说能在表尾进行进栈和出栈的数据2)先进后出(last in first out )3)栈会有栈顶,栈底,通常栈底为高地址,栈顶为高地址,如下图所示原创 2014-01-06 13:54:07 · 1116 阅读 · 0 评论 -
完成函数reverse,要求实现把给定的一个整数取其相反数的功能
题目很简单,完成函数reverse,要求实现把给定的一个整数取其相反数的功能,举两个例子如下: x = 123, return 321 x = -123, return -321今天在网上看到的一个题目,感觉挺简单,做了一下,第一次竟然错了,看看下面为什么long Reverse(long data){#ifdef _DEBUG printf("current data: %d\原创 2013-12-27 22:02:12 · 2220 阅读 · 0 评论 -
再谈sizeof——struct 结构存储空间的大小:与成员的顺序、#progma pack参数有关系
struct 结构存储空间的大小:与成员的顺序、#progma pack参数有关系针对字节对齐,环境使用的gcc version 3.2.2编译器(32位x86平台)为例。 char 长度为1个字节,short 长度为2个字节,int 长度为4个字节。struct 子项在内存中的按顺序排列,在没有#progma pack(n)参数的情况,各个子项的对齐系数为自己长度。在转载 2013-05-10 15:17:20 · 1394 阅读 · 0 评论 -
sizeof与strlen的区别
一、sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。 它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。 由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的转载 2013-04-27 20:21:35 · 627 阅读 · 0 评论 -
选择排序与冒泡排序的比较
选择排序(Selection Sort)算法核心思想:每一趟在n-i+1(i>=1)个记录中选取关键字最小的记录作为序列中的第i个记录简单选择操作:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1先看一个选择排序的思想的代码:int SelectSort(MergeType *L){ int min = 0; if (!L->elem) {原创 2013-12-23 22:56:10 · 1002 阅读 · 6 评论 -
二叉树先序遍历的非递归算法
在前面一文,说过二叉树的递归遍历算法(二叉树先根(先序)遍历的改进),此文主要讲二叉树的非递归算法,采用栈结构总结先根遍历得到的非递归算法思想如下:1)入栈,主要是先头结点入栈,然后visit此结点2)while,循环遍历当前结点,直至左孩子没有结点3)if结点的右孩子为真,转入1)继续遍历,否则退出当前结点转入父母结点遍历转入1)先看符合此思想的算法:int PreO原创 2014-01-06 14:58:29 · 12078 阅读 · 1 评论 -
直接插入排序与折半插入排序
这里从第二个数据开始,比较当前的数据是否小于前面的一个数,如果小于前面一个数据,就将当前数据插入到前面的队列中,在插入到前面数据中的过程,要移动数据这里要注意时间的复杂度:总的比较次数=1+2+……+(i+1-2+1)+……+(n-2+1)= n*(n-1)/2= O(n^2)总的移动次数=2+3+……+(2+i-1)+ …… + n = (n+2)*(n-1)/2=O(n^2)当然还要考虑空间复杂度:其实这里使用了一个变量的存储空间作为移动数据的临时空间这里在移动的过程中,可以减少代码原创 2013-12-23 21:41:53 · 1390 阅读 · 0 评论 -
二叉树先根(先序)遍历的改进
二叉树的特点:每个结点的度最大不能超过2,并且左右子树不能颠倒二叉树的存储结构:下面采用链式存储进行阐述,堆排序算法(快速排序改进)采用的顺序存储结构的二叉树,先看如下结构体的存储方式顺序存储:/*二叉树的顺序存储*/#define MAX_TREE_SIZE 100typedef TElemType SqBiTree[MAX_TREE_SIZE];链式存储:/*二叉原创 2013-12-28 14:01:05 · 1954 阅读 · 0 评论 -
快速排序算法(冒泡算法的改进)
快速排序算法的思想: 1. 通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的记录的关键字小 2. 然后分别对这两部分进行同样的操作 1 的快速排序,以达到整个序列有效原创 2013-12-22 17:09:28 · 1408 阅读 · 0 评论