- 博客(106)
- 资源 (7)
- 收藏
- 关注
原创 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
1971
原创 闹钟程序的设计
@brief : alarm clock and alarm timer@author : comwise @note : timer, you must set correct begin time
2016-08-16 13:21:05
1447
原创 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
3301
原创 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
5061
原创 Qt QTableWidget的使用方式
//QTableWidget行选中/删除/添加行//1 均分各列 tableWidget->horizontalHeader()->setStretchLastSection(true); //就是这个地方 tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch); //2 整行选中:job_
2016-05-31 13:21:55
14305
原创 设计模式之命令模式(Command)
#pragma once#include #include #include //暴露接口层class Command{public: virtual ~Command(void); virtual bool execute() = 0;protected: Command();};//简单命令类,便于不同对象的创建
2016-04-14 10:19:06
555
转载 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
1509
转载 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
2521
原创 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
5333
原创 __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
3209
原创 动态链接库DLL
概述:动态链接库通常不能直接运行,也不能接受消息。他们是一些独立的文件,其中包括可被执行程序或者其他DLL调用来完成某项工作的函数。WINAPI提供的3个重要DLL:Kernel32.dll:包含管理内存,进程和线程的函数User32.dll:包含那些用于执行用户界面的任务的函数,如窗口的创建和消息的发送GDI32.dll:包含那些用于画图和显示文本的函数静态库与动态库
2014-03-23 11:18:47
1529
原创 STL之关联容器(pair、map、set的使用)
1.关联容器与顺序容器的对比1)关联容器是通过键存储和读取元素,而顺序容器则是通过元素在容器中的位置顺序存储和访问元素2)物理存储方式:一般关联容器是非连续内存存储,而顺序容器一部分是连续存储在内存中,随机访问速度较快,如vector、deque关联容器一般包括map、set两种基本的关联容器:【map】关联数组,元素通过键来存储和读取;适用于需要存储/修改每个键所关联的值的情
2014-03-02 21:21:38
3792
1
原创 虚函数与动态绑定的那点事
面向对象编程的概念1)多态:简单理解就是多种形态,通过继承而相关联的类型,特别在运行的情况下,对象可能是基类也可能派生类类型1)继承:能够对类型之间的关系建模,共享公共的东西,仅仅特化本质上不同的东西。定义为virtual的函数是基类期待派生类重新定义的,基类不希望派生类继承的则定义为非虚函数,这样类就有虚函数与非虚函数之分2)动态绑定:使程序使用继承层次中任意类型的对象,无需关心具体的类型。在C++,通过引用或者指针调用虚函数,发生动态绑定,引用或指针既可以指向基类对象也可以指向派生类
2014-02-27 14:10:44
3033
1
原创 调用操作符和函数对象
引言什么是调用操作符和函数对象呢?就是调用操作符看起来像是调用函数,如下设计的一个类,是用来求一个整数的绝对值的,如下类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
1229
原创 成员操作符剖析
前面的操作符都比较一般,但是这里的调用就有点小不同了,如下设计的类(与智能指针类似)class ScrPtr{public: friend class ScreenPtr; friend class ScrPtrTest; //这个先不用管,后面我会用到 ScrPtr(screen* p):sp(p),count(1) { }; ~ScrPtr() { /*delete sp;*/
2014-02-25 22:28:05
1740
原创 下标操作符
有一个vector存储的容器,用下标操作返回容器内的元素,类设计如下:class Index{public: friend ostream& operator<<(ostream& os, const Index& org); Index(void); ~Index(void); int& operator[] (const size_t); const int& opera
2014-02-25 22:07:28
1674
原创 算法操作符和关系操作符
类设计如下:class sales_item{public: friend istream& operator>>(istream&, sales_item&); friend ostream& operator<<(ostream&, const sales_item&); friend sales_item operator+(const sales_item& sale1, c
2014-02-25 21:55:28
1098
原创 输入和输出重载操作符
类的设计如下:class sales_item{public: friend istream& operator>>(istream&, sales_item&); friend ostream& operator<<(ostream&, const sales_item&); //explicit sales_item(void); // 防止隐式转换 sales_item(v
2014-02-22 18:45:26
1623
原创 C++重载操作符
重载操作符原型:返回类型 operator操作符(形参);注意事项:(1)不能通过连接其他合法符号来创建任何新的操作符,如下是错误的: sales_item operator**(const sales_item &org); //error 不能通过连接其他合法操作符来创建任何新的操作符 (2)重载操作符必须一个具有类类型,类成员的话因为有一个默认的本类this
2014-02-22 18:45:08
1053
原创 谈VS2012平台下 += 与 ++ 的关系
今天闲来无事,再次调试这个问题,发现微软的编译器还真是奇葩,经常遇到++与+=的混合计算,如下: int a =1, b=3, c=10; int e, f; int d = 5; ++d += (e=++d) + c; (1) d +=(e=d++) + c; (2) ++d +=(e=d++) + c; (3) cout << d << “ ”<<e<< endl;分别对上述
2014-02-22 12:00:31
1321
原创 智能指针
前景摘要1)在复制控制里面,一般复制成员都是复制其值,复制指针只复制指针的地址,而不会复制指针指向的对象。2) 将一个指针复制到另一个指针时,两个指针指向同一对象,删除其中任意一个,都对另一个有硬性,特别是动态分配的内存,会导致程序崩溃。3) 如何使用指针呢?这里就牵涉几种情况:a)指针成员采取常规指针行为 :指针的缺陷但无需特殊的复制控制b)类采取智能指针行为:指针指
2014-02-21 15:07:59
987
原创 消息处理实例解说
Message处理消息,Folder存放Message消息,一个Message消息可以放入多个文件夹Folder,一个Folder可以存放多个Message按照此种方式设置了Message类插入消息,移除消息,将消息放入所有文件夹,移除所有文件夹中的消息,Folder类存放消息,移除消息class Folder;class Message{public: Message(const
2014-02-19 16:02:13
1192
原创 C++赋值操作符与析构函数
赋值操作符的定义:1)赋值操作符,就是常用变量赋值的“=”,将一个玩意赋值给另一个玩意2)默认形式:classType & operator=(const classType &);operator后面紧跟要重载的操作符就是操作符重载的默认形式;形参是本类类型的引用,默认第一个形参就是类类型对象自己的指针this;返回类型就是类类型的引用合成赋值操作符:合成赋值操作符也是采用
2014-02-18 16:44:46
1270
原创 C++复制构造函数
复制构造函数、赋值操作符、析构函数总称为复制控制复制构造函数定义:是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用用于的情况:1)初始化对象 ,根据另一个同类型的对象显式或隐式初始化它复制对象2)作为实参传给函数时,复制这个对象3)函数返回时,复制对象4)初始化顺序容器中的元素5)根据元素初始化列表初始化数组元素1. 对象的定义
2014-02-17 13:45:09
1003
原创 C++构造函数
C++中构造函数是特殊的成员函数,只要定义类的新对象就会执行构造函数,构造函数是保证每个对象的数据成员具有合适的初始值。构造函数特点:1)构造函数与类同名,不能指定返回类型,且不能声明为const函数,详见const的使用2)构造函数可以重载,所以可以有多个构造函数 sales_item(void) /*const*/; sales_item(istream &is /*= ci
2014-02-13 15:43:25
1002
原创 你所不知道的 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
1209
原创 Linux 内核中宏 offsetof 与 container_of 的含义
在linux源码中经常会使用用成员指针得到当前结构体变量的指针,就是使用container_of,在定位源代码会看到如下:#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)/** * container_of - cast a member of a structure out to the containing
2014-01-13 17:32:32
1350
原创 服务器IO模型之Select
阻塞与非阻塞:widows下创建套接字默认都是阻塞型的,阻塞型的好处是处理简单,理解容易,但是处理多个套接字时,就必须创建多个线程,即一个连接socket使用一个线程。而非阻塞模式比如在处理发送和接收数据时,会立即返回,不管是否有有效的数据,这就需要不断测试返回代码,来确定套接字在什么时候可读/可写,也就是确定网络事件何时发生,比如中断默认就是一种事件触发型,比如菜单按钮也是事件触发性,但
2014-01-09 23:04:41
1635
原创 二叉树先序遍历的非递归算法
在前面一文,说过二叉树的递归遍历算法(二叉树先根(先序)遍历的改进),此文主要讲二叉树的非递归算法,采用栈结构总结先根遍历得到的非递归算法思想如下:1)入栈,主要是先头结点入栈,然后visit此结点2)while,循环遍历当前结点,直至左孩子没有结点3)if结点的右孩子为真,转入1)继续遍历,否则退出当前结点转入父母结点遍历转入1)先看符合此思想的算法:int PreO
2014-01-06 14:58:29
12177
1
原创 顺序存储的栈
栈定义:仅限在表尾进行插入和删除的线性表栈的特点:1)一般来说能在表尾进行进栈和出栈的数据2)先进后出(last in first out )3)栈会有栈顶,栈底,通常栈底为高地址,栈顶为高地址,如下图所示
2014-01-06 13:54:07
1151
原创 插入排序之希尔排序(Shell Sort)
希尔排序:缩小增量排序,属于插入排序的一种,从前面的直接插入时间分析可知,其时间复杂度为O(n^2),若待排序的记录基本有序,其时间复杂度可以提高至O(n)基本思想:先将整个待排序的记录序列分割为若干个子序列分别进行直接插入排序,,待整个序列基本有序时,再对全体记录进行一次直接插入排序特点:1)子序列不是简单的分段,而是相隔某个增量的记录组成一个子序列2)增量务必是素数或者说质数,
2013-12-29 22:56:25
912
原创 如何使用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
3972
原创 二叉树先根(先序)遍历的改进
二叉树的特点:每个结点的度最大不能超过2,并且左右子树不能颠倒二叉树的存储结构:下面采用链式存储进行阐述,堆排序算法(快速排序改进)采用的顺序存储结构的二叉树,先看如下结构体的存储方式顺序存储:/*二叉树的顺序存储*/#define MAX_TREE_SIZE 100typedef TElemType SqBiTree[MAX_TREE_SIZE];链式存储:/*二叉
2013-12-28 14:01:05
2018
原创 完成函数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
2289
转载 GIT在Linux上的安装和使用简介
GIT最初是由Linus Benedict Torvalds为了更有效地管理Linux内核开发而创立的分布式版本控制软件,与常用的版本控制工具如CVS、Subversion不同,它不必服务器端软件支持,速度和效率也有着相当程度的提高。 如果拥有CVS或者SVN的使用背景,那么更熟悉的方法是客户端-服务器端模式,所有的文件仓库(repository)都是存放在服务器上的,用户需要在本地
2013-12-27 16:28:48
721
原创 归并排序算法之错误修正
归并排序:将两个或者两个以上的有序表合并成一个新的有序表,二路归并就是一组数组中前后相邻的两个有序序列归并为一个有序序列二路归并的核心思想:假设有n个序列,然后两两归并,得到[n/2]个长度为2或者1的子序列;然后再两两归并,……,直至得到一个长度为n的有序序列为止看下面2路归并算法的实例:int MSort(MergeType S, MergeType *pT, int nStart, int nEnd){ int nMidPos = 0; if ( !S.elem || nStart > n
2013-12-26 21:54:36
1552
原创 堆排序算法(选择排序改进)
首先要理解堆的含义:要么所有节点都不大于其子孩子节点数据,要么都不小于其子孩子节点数据堆排序的核心思想:就是要满足所有节点都满足上面两点,如何完成堆排序的步骤:1.首先要建成一个大顶堆或者小顶堆,在建的过程中其实就是调整节点的位置,首先要从最后最后一个节点的母亲节点开始,按照堆的含义调整。为什么不是最后一个或者其他?因为要保证完整性和不必要性,所以只需从最后一个的母亲节点开始即可(下面的堆
2013-12-26 21:41:53
1295
Mini2440 Nor Flash 芯片手册(S29AL016J_00)
2013-06-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人