C++
文章平均质量分 53
清水迎朝阳
多年windows下c++客户端开发,或多或少踩了很多坑,积累了一些经验
展开
-
c# c++程序 交互
/退出子进程//给C++进程发送。原创 2024-09-02 18:41:57 · 424 阅读 · 0 评论 -
json数据解析
对象的值又是数组的情况下,读取方式。原创 2023-09-13 15:37:03 · 479 阅读 · 1 评论 -
console控制台程序,转winMain窗口程序
这样,控制台程序就转为窗口程序了。将此处的_CONSOLE去掉。改成 WinMain。原创 2023-03-27 18:37:14 · 280 阅读 · 0 评论 -
C++小知识点 &&的优先级高于||、指针指向的起始地址为低地址
1 &&的优先级高于||while(i这段函数有问题,可能出现越界读取内存错误。原因: 相当于 (i 当i==nLen时,已经判断出左侧表达式为假,因此不需判断nStr.Get(i) 但因为总体是或结构,所以仍需判断右侧表达式 nStr.GetAt(i), 这样就会在判断右侧表达式时,产生越界读取错误。原创 2021-04-08 14:57:28 · 407 阅读 · 0 评论 -
c++ 小知识点 单例模式、相对路径转绝对路径
1、单例模式定义// "TypeName type" will be lazily created on the first time it's accessed#ifndef BASE_MEMORY_SINGLETON_H_#define BASE_MEMORY_SINGLETON_H_namespace nbase{#define SINGLETON_DEF...原创 2018-09-26 15:06:08 · 372 阅读 · 0 评论 -
QT 小知识点
0 QT 项目转VS项目CMD 转到工程目录然后输入qmake –tp vc1.格式化数据 QString str = QString("%1%2"). arg(QTStr("屏幕"), QString::number(i+1)); QString str = QString("%1 %2: %3x%4 @ %5,%6"). ...原创 2020-01-09 15:47:14 · 280 阅读 · 0 评论 -
VECTOR容器总结
1 清空所有元素m_itemVector.clear();2 遍历 vector::iterator iter=m_itemVector.begin(); for(i=0;iter!=m_itemVector.end();iter++,i++) { if(iter->flag==-1) { break; } iter->flag=1原创 2013-06-27 12:57:26 · 1417 阅读 · 0 评论 -
对vector等STL标准容器进行排序操作
西方有句谚语:不要重复发明轮子!STL几乎封装了所有的数据结构中的算法,从链表到队列,从向量到堆栈,对hash到二叉树,从搜索到排序,从增加到删除......可以说,如果你理解了STL,你会发现你已不用拘泥于算法本身,从而站在巨人的肩膀上去考虑更高级的应用。排序是最广泛的算法之一,本文详细介绍了STL中不同排序算法的用法和区别。1 STL提供的Sort 算法C++之转载 2013-06-27 12:56:58 · 1292 阅读 · 0 评论 -
switch……case不能匹配字符串的方法
思路: 将字符串添加到map容器中 然后比较字符串名 获得该字符串所对应的索引值 在Switch中使用这个索引值判断 在stdafx.h 添加头文件 #include //注 在CPP中直接添加头文件时 出现了错误 不知道什么原因造成的 CString fontNam原创 2012-09-05 17:22:41 · 9447 阅读 · 0 评论 -
一个指针转换引起的问题及谈起”高位优先,低位优先”
在hp或aix机上试一下这个程序就知道int为4字节,short为2字节 #includeint main(){ int i=0; fun(&i); printf("%i %x\n",i,i); return;}int fun(short * i){ *i=2;} 从已有知识,我认为打印出来的是: 2,2转载 2012-08-13 11:14:47 · 2693 阅读 · 0 评论 -
将数字映射到字母上
映射成 A1------A20 B1------B20 。。。 Z1------Z20这种形式 数字从0开始编号:则: 0----19 对应 A1-----A20 20---39 对应 B1-----B20 #define CHA原创 2012-05-09 15:32:25 · 4366 阅读 · 0 评论 -
DWORD WORD BYTE 相互转换
DWORD WORD BYTE 相互转换 DWORD 4个字节 WORD 2个字节 BYTE 1个字节 1) DWORD--->WORD DWORD dw=0; WORD hW=HIWORD(dw); WORD lW=LOWORD(lw);2)WORD--->DWORD DWORD dw=0;原创 2012-05-08 17:19:14 · 18154 阅读 · 0 评论 -
字块旋转
数据结构:一个字占用一个字块,所有的字块用双向链表进行连接 // 字块结构 其中一个字占用一个字块typedef struct word{ int Left; int Top; int Right; int Bottom; int FontSize; wchar_t Str[3]; // 双向链表 struct word*原创 2011-12-29 14:14:47 · 1288 阅读 · 0 评论 -
在堆上申请一个容器空间
C++中变量和对象有两种创建方式,一种是创建在栈上,一种是创建在堆上然后通过指针引用。当然list容器也是一致的。 list容器的创建: list myList; list *yourList=new list; list动态数组的创建:原创 2009-10-16 14:37:00 · 1804 阅读 · 0 评论 -
用事件判定线程的结束与否
本文由 代码助手软件 整理发布 内容与本软件无关 更惬意的读、更舒心的写、更轻松的发布HANDLE g_hTic1=CreateEvent(NULL,TRUE,TRUE,NULL); //自动复原 有信号UINT Tic1(LPVOID pTView){ ResetEvent (g_hTic1);//重置为无信号 CMyV原创 2014-12-25 17:12:43 · 1236 阅读 · 0 评论 -
vector.resize 与 vector.reserve的区别
reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。再者,两个函数的形式是有区别的,reserve函数之原创 2008-12-23 11:40:00 · 33299 阅读 · 8 评论 -
分隔符,解析字符串
一:使用Tokenize分隔字符串时候,两个连续的字符串 被视为一个//解析学生信息: 郑丽恩\t\t 163 \t 2 \t 3void ParseStudentInfo(CString stuInfo, std::vector &strVec){ strVec.clear(); CString sperator = L"\t"; CString tokenStr;原创 2017-02-25 14:14:48 · 1080 阅读 · 0 评论 -
不能将“this”指针从“const CPaopao”转换为“CPaopao &
CPoint CPaopao::GetCenter() { return rc.CenterPoint(); } float CPaopao::Distance(const CPaopao& ortherPaopao){ CPoint pt1=GetCenter(); CPoint pt2=ortherPaopao.GetCenter();原创 2017-04-25 15:18:55 · 4055 阅读 · 0 评论 -
c++内存泄漏解决方案
使用C++,不可避免的会遇到内存泄漏问题,遇到这个问题怎么办呢?我是一般从这几个方面考虑:第1种、显性的 new malloc delete free 是否匹配 这是最基本的,也就不多说了。第2种、隐形的,这个就较为复杂了 之所以说是隐形的,是因为他们没有调用new malloc ,但你不注意的情况下,也有可能造成内原创 2017-11-24 11:11:18 · 3091 阅读 · 0 评论 -
处理 程序异常崩溃后的善后工作
好像以前面试被问过,没回答出来,但一直没用到过,也就没研究。今天看了些代码,发现要实现崩溃后的处理,竟然很简单。看来很多东西只是见没见过,没见过觉得很神奇,见过了其实也没啥。要实现程序异常崩溃后的善后工作:包括当时堆栈情况-内存空间数据、是否重启登,只需要调用SetUnhandledExceptionFilter这个函数就可以了。实现:1、在程序刚启动时,设置未捕获异常的处理函数 为什么呢?...原创 2018-07-10 16:38:47 · 1733 阅读 · 0 评论 -
共享内存 ,同步机制
共享内存Windows 下进程的地址空间在逻辑上是相互隔离的,但在物理上却是重叠的。所谓的重叠是指同一块内存区域可能被多个进程同时使用。共享内存,各个进程可以共享同一块物理内存,进程可以直接读写内存,不需要数据拷贝。由于多个进程共享一块内存,所以也需要同步机制 一实现步骤步骤:本进程创建 1) 创建内存映射文件对象 CreateFil...原创 2019-02-27 16:48:17 · 3690 阅读 · 1 评论 -
共享内存
一进程逻辑空间 物理空间如上图所示,每个进程都有自己的逻辑空间,这些逻辑空间,会被映射到具体的物理空间中。每个进程的逻辑空间都是彼此隔离,相互独立不受干扰的。但是他们都会被映射到同一个物理空间去,当其所映射的物理空间有重叠的时,这重叠的部分就共享了物理内存二共享内存关键问题创建物理内存将物理内存映射到进程空间读写互斥控制1)创建物...原创 2019-07-10 19:12:27 · 519 阅读 · 0 评论 -
exit()和return语句的区别
(一)exit用于结束正在运行的程序,exit函数将参数是返回给OS。而return是返回函数值并退出函数。(二)return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。(三)在main函数(其代表一个进程)结束时会隐式地调用exit函数。exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程。所以一般程序执行到 main转载 2011-08-17 15:03:23 · 981 阅读 · 0 评论 -
字符数组,字符指针,Sizeof总结
Sizeof与字符串 1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写 "abc",那么编译器帮你存储的是"abc/0" 2."abc"是常量吗?答案是有时是,有时不是。 不是常量的情况:"abc"作为字符数组初始值的时候就不是,如 char str[] = "abc"; 因为定义的是一个转载 2011-06-24 11:58:00 · 4370 阅读 · 0 评论 -
关于类型转换 此作者总结的很好
刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。我们先定义一些常见类型变量借以说明 int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username[]="程佩君";转载 2009-09-25 17:45:00 · 807 阅读 · 1 评论 -
CString类Format()的用法
Format() 函数用于将数据转换为格式化的字符串输出 举例如下; int x = 123; CString str; str.Format("%d", x); // 123 str.Format("%6d", x);原创 2009-09-25 17:39:00 · 4903 阅读 · 0 评论 -
引用类型的方便性
在对话框类 CDlg 中定义了一成员变量 在另一个类B中希望得到该成员变量的信息 于是,在B中写了一个成员函数Func(CDlg dlg ), 并将其作为CDlg的友元函数,使其可以访问其私有数据 在对话框中希望传送对话框信息给dlg 使用了 Func(*this) 但是编译时出错 ,提示 对话框拷贝构造不行等信息。 个人理原创 2009-09-28 11:05:00 · 701 阅读 · 0 评论 -
VS配色方案
Visual Studio 6.0 编辑器配色方案复制以下代码保存成.reg文件,然后导入注册表。--------------------------------------------------------------------------------------------------------------------Windows Registry Editor Ver转载 2009-09-10 13:54:00 · 3646 阅读 · 0 评论 -
二级指针的作用及用途
之所以定义二级指针**P,不是为了使用**P表示指向的值,而是为了使用*P来存储存储值的那个单元的地址。 Void GetMemory2(char **p, int num){*p = (char *)malloc(num);}void Test(void){char *str = NULL;GetMemory(&str, 10原创 2009-04-21 19:54:00 · 5217 阅读 · 2 评论 -
小数点输出精度控制问题
setf()是追加标志字的函数,而flags()是设置标志字 fixed标志是以定点形式显示浮点数 当有fixed标志时,说明数据按一定的位数输出,否则去掉fixed标志后,数据按原位输出---即小数最后面的0不显示 因此,使用时有两种情况: (1)原位输出,这时应去掉fixed标志: cout。unsetf(ios::fixed)原创 2009-03-29 17:32:00 · 4561 阅读 · 0 评论 -
int (*p)[4] p 是二级指针 二维数组 二级指针
试验一:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int (*p)[4];for(p=&a[0];pcout0012FF400012FF400012FF40for(p=&a[0];pcout0012FF440012FF540012FF64for(p=&a[0];pcout0012FF440012FF540012FF64for(p=&a[0];p原创 2008-11-27 13:08:00 · 2536 阅读 · 0 评论 -
new 动态分配数组空间
(一)定义一个整数 int *p =new int; int *p =new int(4); //赋初值4 (二)定义一个一维数组 int *p =new int[SIZE]; P 指向的为数组的首地址,数组是以int类型为基本单元的,p作为数组名使用 (三)定义一个二维数组 int(*原创 2008-11-17 16:13:00 · 9870 阅读 · 2 评论 -
编译器如何解释基类指针
原创 2008-10-29 11:38:00 · 891 阅读 · 0 评论 -
基类,派生类,内存分配情况
派生类继承基类 内存分配时,是在于基类对象不同的内存地址处,按基类的成员变量类型,开辟一个同样的类型空间,但注意开辟后派生对象的空间,不是复制基类的成员的值,而是仅仅开辟那种成员类型的空间,未初始化时,里面存在的数是不确定的 然后派生类自己定义的成员变量是排在继承的A类成员下面,如果派生类定义的变量名与基类相同,则此变量覆盖掉继承的基类同名变量,注意,覆盖不是删除,原创 2008-10-28 10:32:00 · 5098 阅读 · 4 评论 -
查找指定目录下的文件
使用CFindFile类, 此类主要是用来查找文件的,首先调用 FindFile() 函数 ,来开始查找过程,然后调用FindNextFile来得到后续的文件信息等。注意: 此类在vs控制台下不能编译成功,只能在MFC运行才可以MSDN中的解释为:Call this member function to open a file search.原创 2009-09-25 18:04:00 · 2740 阅读 · 0 评论 -
先声明再定义的必要性
类A定义 在A.h中 实现在A.cpp 类B定义 在B.h中 实现在B.cpp 在类A中需要引用类B的类型 而类B也需要引用类A的类型 这样 如果在类A.h加如#include"B.h" 在类B.h加入#include"A.h" 会出现什么原创 2009-09-28 10:31:00 · 2341 阅读 · 0 评论 -
1 2 3 4 5 6 7 8 9=10 各个数可正可负 如何等于10
<br /> <br /> <br /> 今天同事给了一个这样的问题 <br /> 是一个初一学生问他的,结果没做出来,就告诉那学生,这道题出错了<br /> 学生回他:你不会做,就别说题错了 找借口<br /> 额,很是尴尬<br /> 今天,拿这道题来问我们<br /> <br /> <br /> 1 2 3 4 5 6 7 8 9=10<br /> <br /> 我想了很多可能,都没有得出10这个数<br /> <br /> 只好编个程序来实现<br /> <br原创 2010-09-02 13:11:00 · 12360 阅读 · 0 评论 -
fscanf的返回值未成功输入的元素个数
test.txt 中保存的为:12345 程序 int i,j,k; FILE *fp=fopen("e://test.txt","r"); if (fp==NULL) { //return FALSE; } while (!feof(fp)) { j=fscanf(fp,"%d%原创 2009-10-19 13:06:00 · 4261 阅读 · 0 评论 -
MSDN 中 对vector::erase()的解释
vector::eraseRemoves an element or a range of elements in a vector from specified positions.iterator erase( iterator _Where);iterator erase( iterator _First, it原创 2009-10-16 14:05:00 · 1699 阅读 · 0 评论 -
erase() 返回的是删除此元素之后的下一个元素的迭代器
比如:我写的一个程序中,要删除某个位置的元素 for(list>::iterator pos=point_to_file_list.begin();pos!=point_to_file_list.end();pos++) { for (list::iterator pos_line=(*pos).begin();pos_line!=(*pos)原创 2009-10-16 13:51:00 · 1375 阅读 · 0 评论