C/C++
文章平均质量分 76
Sagittarius_Warrior
这个作者很懒,什么都没留下…
展开
-
单词接龙
最近碰到了一个比较有意思的算法题 —— 单次接龙,我尝试做了一下,虽然能解,但是时间复杂度让我很不满意,于是google了网友的解法,找到一个比较满意的算法 —— 链接,作者是用JAVA实现的,我在此将它转换为C++实现。 问题描述 拉姆刚开始学习英文单词,对单词排序很感兴趣。如果给拉姆一组单词,他能够迅速确定是否可以将这些单词排列在一个列表中,使得该列表中任何单词的...原创 2018-03-28 17:06:51 · 2427 阅读 · 0 评论 -
License系统设计(二)
本文主要讲解License Generator的实现,总体设计请参考前一篇文章。一、导出导入库 License Generator是采用QT实现的,它需要导入前面的加解密DLL。导入库的设计如下:#ifndef AES_DLL_H#define AES_DLL_H#ifdef AES_IMPORT#define AES_API extern "C" __declspec(原创 2016-12-07 10:36:13 · 3179 阅读 · 0 评论 -
Error:LINK2005和MTd与MDd
最近,在我的程序中调用一个外部库编译时,报大量的链接错误:Error:LINK2005,google了一下,找了一篇很好的解释“LINK2005”编号错误的博客,分享如下: http://www.cnblogs.com/MuyouSome/p/3332699.html造成LNK2005错误主要有以下几种情况: 1.重复定义全局变量。可能存在两种情况: A转载 2016-11-30 10:53:11 · 1468 阅读 · 0 评论 -
C++文件读写和字符串处理
http://blog.csdn.net/kingstar158/article/details/6859379转载 2016-04-15 08:57:13 · 590 阅读 · 0 评论 -
一招搞定“C语言声明式”类型的面试题
在C语言面试中,经常会考查面试者对“C语言声明式”的理解,这类题型听起来就像绕口令一样,一不小心就容易将人绕到沟里,比如:题1:说明如下四种声明式的区别1)const char * p;2)char const * p;3)char * const p;4)const char * const p;题2:写出如下几种要求的声明式(或定义式)1)一个有10个指针的原创 2016-09-06 16:54:08 · 763 阅读 · 0 评论 -
C++11创建一个跨平台线程池
看完《Windows核心编程》的“线程池”这一章后,仅仅是学到了几个Windows线程池相关的API的,并没有触及到线程池是如何实现的这个层次,总感觉意犹未尽,特别手痒,想要自己实现一个简单的线程池。偶然的,想起了之前买的祁宇老师的《深入应用C++11》中,有一章介绍“使用C++11实现一个线程池”,于是按照原书敲了一顿代码,在VS下顺利运行起来了,兴奋不已。然后,再深入一想,既然是纯C++实现的原创 2016-09-07 14:43:47 · 1666 阅读 · 0 评论 -
《Windows核心编程》之”Unicode vs ANSI“
《Windows核心编程》第二章专门介绍编程中的字符和字符串编码以及相关库函数,主要涉及”Unicode“和”ANSI“。书上描述的非常透彻,在此,我将它的主要思想精简并概括如下:一、字符(串)类型 ANSI和Unicode是两种不同的字符编码方式。ANSI一般以一个字节(8bits)来编码所有的字符,理论上可以表示256种字符;Unicode,一般指UTF-...原创 2016-07-27 17:19:26 · 615 阅读 · 0 评论 -
Printf的格式控制和使用技巧
printf tricks 前言:发现一个小小的printf既然有这么多的功能我不知道,强大的“二八法则”,再次证实了它的威力。转自http://www.georgevreilly.com/blog/2005/06/02/PrintfTricks.aspxPrintf tricksIt may be old-fashioned, but I still find p转载 2016-06-16 16:17:26 · 1877 阅读 · 0 评论 -
VS2010工程迁移到VS2013(或VS2015)遇到的SDL问题
该编译选项在VS2013及以后版本,默认为开启状态。故将VS2010的工程迁移到VS2015时,就会触发与它相关的编译错误(不管是通过“双击.sln文件”自动升级,还是新建工程,拷贝代码的方式)。 最常见的编译错误是上表列出的“C4996”——“使用标记有deprecated函数”。 这些被启用的函数包括:“strcpy”等字符串操作函数和”inet_addr“等socket函数。解决的办法有两种:一是使用新的微软推荐的安全函数逐个代替这些被弃用的函数;二是将SDL编译选项关原创 2016-07-21 09:13:03 · 5427 阅读 · 1 评论 -
异或在C/C++编程中的应用
本文主要介绍C/C++编程中两个巧用异或解决问题的方法。一、巧用异或进行取反运算 假设安排一个周健身计划表,每天的可选项目包括:running,riding,swimming。现用一个enum表示周一到周日,如下:enum Day{ Monday = 0x1, Tuesday = 0x2, Wednesday = 0x4, Thursda原创 2016-12-22 14:07:00 · 2471 阅读 · 0 评论 -
STL vector与数组的互转
C++ STL库中vector素有动态数组的美誉,为什么?我想有以下几个原因:1)它能够弥补普通数组(如“int a[8]”)只能固定长度的缺陷;2)它能弥补一般堆数组(如int *p = new int[n])需要预先知道长度,并且长度不可变的缺陷。 在有些情况下,比如从文件中读取一组未知长度的float型的数据。3)相对STL中其他容器,如list,vector与数组更接原创 2017-01-05 13:36:13 · 39629 阅读 · 2 评论 -
在Windows上编译、应用glog
glog是google提供的一个开源的C++日志库。由于最新的glog源码工程中,已经移除了“.sln”文件,代之以“a CMake build system”,在Windows平台下应用最新的glog库,需要自行使用CMake来生成适用不同版本VS的“.sln”文件。这个过程相对来说,有点小繁琐,特以此文记录并分享给大家。注:glog下载链接:https://github.com/goo原创 2017-08-22 17:31:21 · 13254 阅读 · 0 评论 -
VS2015 C++程序调Pyhon脚本
前面几篇文章介绍了:python程序如何调C DLL,如何使用VS2015调试python程序和调试被python调用的C DLL程序。本文则反过来探索,在C++程序中如何调python脚本。大致有两种方法:一是使用“system()”函数启动python解释器,在外部执行python脚本;二是将python解释器嵌入C++程序中,直接执行嵌入的python代码。一、system()函原创 2017-06-23 15:41:00 · 4896 阅读 · 0 评论 -
面向对象设计的一个有缺陷的缓存机制
虽然这个标题有点拗口,但是它是我最近在项目中碰到的一次由最初的错误设计导致的重大bug。这类架构层面的设计失误,从一开始就埋下了隐患,后续随着开发小组的变动和软件模块的增加,非常难以跟踪,此外,一当软件编码完成,再有架构层面的变动,是非常耗时耗力的。故此,我将它复原出来,以免再犯同类错误。一、最初的设计1,总体架构 最开始我们小组要开发一款“频谱仪”的控制软件,它原创 2017-05-11 10:57:39 · 447 阅读 · 0 评论 -
VC++代码执行速度优化
本文主要整理MSDN几篇关于VC++编译器优化的几篇文章,试验并总结了一个简单易用的VC++代码优化的攻略。一、基础知识 VC++代码优化分为两类:代码大小优化和代码速度优化。本文主要关注代码速度优化,在某些需要高效率的应用场景下,代码的执行速度有极大的应用价值 。二、按配置文件优化 按配置文件优化可以优化输出文件,其中优化程序使用的数据是通过对 .exe原创 2017-02-24 09:58:37 · 3913 阅读 · 0 评论 -
Windows CMD命令行编程总结
众所周知,Windows操作系统是图形化的操作系统,对于普通用户来说,它极大地降低了操作难度。但是,对于程序员来说,你有时候会发现,Windows 下的IDE不如Linux的bash来的高效和便利。事实上,这是一个误区,Windows也支持命令行编程。CMD就是Windows自带的shell。我在之前的几篇博客里都用到过Windows CMD和bat(批处理),但都是零散的介绍,本文主要将以前的知原创 2017-01-20 09:52:15 · 18456 阅读 · 2 评论 -
License系统设计(一)
本系列文章主要介绍我近期设计的一个软件License系统。一、软件需求 假设M公司要发布一款软硬件一体的产品,名为“OfficeDevice”。这个OfficeDevice的上层是一个PC,下层带一些嵌入式设备,而PC上运行一个叫“Office Kits”的软件,这个软件包含三个功能模块:Word、PPT和Excel。 现在要设计一个License系统,需满足以下两点需求:原创 2016-12-07 10:08:49 · 10189 阅读 · 1 评论 -
VS中DLL的导出宏的定义和头文件的位置导致的两类编译错误总结
一般地,我们在新建一个win32的动态链接库(DLL)时,会采取如下的方式的来编写导出接口文件(.h)。#pragma once#ifndef API_EXPORT#define DECL_API extern "C" __declspec(dllimport)#else#define DECL_API extern "C" __declspec(dllexport)#endif原创 2016-12-29 14:59:13 · 2592 阅读 · 0 评论 -
Linux下C++程序调试
Linux下C++程序调试转载 2016-06-12 15:50:58 · 702 阅读 · 0 评论 -
符号性和符号扩展
一、符号性 无论是host与net之间进行通信,还是host与device之间进行数据传输,发送者与接收者必须商定一个细节:传输的数字是否带有符号。我们知道:1 byte = 8 bits ,一个字节可以表示 0~255 之间的值(2 ^ 8 = 256)。如果你不需要负数,事实就是这样,但是对于许多应用程序来说是需要负数的。幸运的是,也可以用一个字节表示 -128 ~转载 2016-05-21 11:03:46 · 1763 阅读 · 0 评论 -
字节序(Byte Order)
本文主要转载网上关于”字节序“的介绍。具体参考的以下三篇博客: 字节存储排序:大端与小端的判别和转换 Wiki:字节序和Wiki:Endianness 这几篇网文已经将”字节序“解释的比较清楚了,我在此仅翻译部分wiki的内容和使用VS的内存窗口演示一下。1,代码和内存分布long long largeNumbe转载 2016-05-19 19:16:35 · 845 阅读 · 0 评论 -
C++之日志打印
Abstract:1,从console输出到文件文件输出;2,添加时间戳;3,添加类名;4,添加函数名、文件名和行号;5,跨线程调用;原创 2015-11-24 13:48:02 · 11908 阅读 · 0 评论 -
C++设计模式之动态创建
Abstract:1,基本元素:工厂模式、函数指针和函数指针映射、链表、宏、静态全局变量控件、(虚函数)多态2,链表地址追踪实验;3,MFC动态创建原理演示;4,自定义动态创建示例;一、简述动态创建(DynamicCreation)是MFC六大核心机制之一。它的本质就是在运行时根据“类的某些信息”(如类名——字符串)创建对应的类对象,且客户代码(类对象的创建之处)无需包含待创建原创 2015-11-25 09:43:36 · 1132 阅读 · 0 评论 -
浅谈:函数指针、仿函数和函数适配…
一,仿函数是什么前几天写了篇博客——浅谈函数指针,主要讲我对函数指针的理解和应用经验。今天,翻看了《C++PrimerPlus》第16章“函数对象”这一节,发现C++中还有比函数指针更高层次的抽象——functor,中文名为“仿函数”“类函数”或“函数对象”。它的实际就是“重载了'operator()'的类”,并兼容函数指针。如下:class Linear{private: do原创 2015-11-25 09:43:07 · 1256 阅读 · 0 评论 -
浅谈一般函数指针和类的非静态成员…
1,语法2,应用场景3,应用技巧4,回调函数参考《C++ Primer Plus》《Effective C++》和“博客:类的成员函数指针”一、函数指针的一般原理与数据项类似,函数也有地址。函数的地址是存储其机器语言代码的内存的起始地址。函数调用,实际上就是执行内存在以函数地址为起始点的这段机器码,故只要获取函数地址,即可执行函数调用。而函数指针就是这样一中指向某类特定函数的的内存原创 2015-11-25 09:43:02 · 665 阅读 · 0 评论 -
C++静态函数和全局结构体变量应用…
应用场景:要求:1,某个C++工程中,需要在很多个类对象中,获取一个分类信息,并根据分类信息执行不同的操作;2,该分类信息需要在工程代码的入口类构造函数中赋值,其他地方最好限制为只读。待选方案:1,全局结构体变量;2,类的静态函数; 功能代码段一:#ifndef CATEGORYINFO#define CATEGORYINFO#include "SF_RFID_Com原创 2015-11-25 09:42:46 · 3765 阅读 · 0 评论 -
从内存和对象的角度看C++类的静态…
提纲:1,C++的内存分区:stack heap和静态存储区;2,静态对象和实例对象;3,使用规则;4,应用场景;一、C++的内存分区和对象模型参考《C++PrimerPlus》第9章“内存模型和名称空间”,C++中用“持续性、作用域和链接性”三个属性来表征其存储特性,包括变量和函数。C++的内存模型大致可以分为三块:堆(heap)、栈(stack)和静态存储区(可能有第四块存储区原创 2015-11-25 09:43:41 · 436 阅读 · 0 评论 -
try-catch应用心得
一、C/C++编程中的异常机制1,函数返回值判断普通的函数无返回值类型,如void func(intn)。如果函数内部有逻辑错误,仅仅是return,函数的调用者无法知道该函数是正常执行完毕返回的还是异常返回的。如果将返回值改为bool型或者int型,则调用者可以通过判断返回值,来确定被调函数是否有异常。2,全局变量程序中定义一个全局变量,任何函数发生异常时,都可以去修改该全局变量,调原创 2015-11-25 09:42:57 · 752 阅读 · 0 评论 -
容器遍历之foreach学习心得
C++中遍历容器的方法有很多种,如普通for循环+容器长度,STL迭代器等,其中,for each的用法最简洁。一、标准C++的写法如下:for each (object var in collection_to_loop){}注:在VS编辑器中,可以直接选择foreach即可生成,但生成的代码见上,for与each之间有空格。 STL的算法库中,还提供了一个for_each(原创 2015-11-25 09:42:41 · 1736 阅读 · 1 评论 -
代码优化之自动修改
一、代码优化的文本编辑工具 我们在进行代码优化的时候,会经常遇到代码查找和替换,手动“ctrl + c”和“ctrl + v”等操作。博主主要使用VS2013作为代码编辑工具,首先就介绍几个VS2013的常用快捷操作。(参考:VS2013快捷键)1,VS2013支持的操作“ctrl + f" 在文件内查找,也可以执行替换(f -- find)"ctrl +shift原创 2016-01-27 16:02:28 · 851 阅读 · 0 评论 -
代码优化之map应用
一、map应用简介 map是C++标准库(STL)中的一个关联容器(Associative Container),它包含的元素由键值对(key-value)组成,(参考map C++ Reference)。普通的容器,比如array或vector,它只能通过下标(index)来索引,它的索引器被限制为int类型(C#可以自定义索引器);而map则可以通过key来索引,获取对应的v原创 2016-01-27 13:59:02 · 845 阅读 · 0 评论 -
论“使用C++非内置全局变量的风险”
一、C/C++语言中的各种变量 C/C++语言中 的变量(variable)根据其存储持续性(生命周期)、作用域(scope,可见性)和链接性(linkage)(参考《C++Primer Plus》或博客)可以分为(static)全局变量、静态局部变量和自动变量(临时变量)以及类的成员变量。代码中使用最频繁的一般是自动变量,它的生命周期从定义的时候开始,代码块(花括符)下边界结束,原创 2016-01-20 08:54:54 · 1233 阅读 · 0 评论 -
DMA传输中的内存对齐
本文主要讲述在host与device之间DMA传输时,一个与“内存对齐”相关的,并最终引起系统概率性蓝屏的bug。参考博文:内存对齐内存对齐2参考博文3参考博文4原创 2016-05-18 13:47:40 · 6646 阅读 · 0 评论 -
32位的整型数拆分为两个浮点数的方法
在数字信号处理领域,常常需要将基带采集的AD数据传送到PC,并进行相应的处理和数据可视化。在基带,特别是FPGA中,一般不采用浮点运算,故基带会用一个unsigned long来表示一对IQ数据,其中高16位表示I路,低16位表示Q路。基带将这样的一堆usigned long传递给上位机后,上位机需要将它们拆分位两个浮点型的数组来存储。这个拆分可以用如下的一个函数来完成:void ULONG2原创 2016-04-23 09:19:46 · 2438 阅读 · 0 评论 -
VC中常用预编译指令
在vc的动态链接库中,常见__declspec(dllexport),在此搜索一些资料,总结一下。它的大致意思是:declare specific(猜的)摘自MSDN:点击打开链接Microsoft 专用用于指定存储类信息的扩展特性语法使用 __declspec 关键字,该关键字指定给定类型的实例将与下面所列的 Microsoft转载 2016-05-07 09:29:37 · 967 阅读 · 0 评论 -
调用约定和函数导出名
本文主要介绍C/C++编译中的调用约定,包括:cdecl、stddecl、VC++编译器、mingw编译器、gcc编译器、g++编译器。一、调用约定的内涵调用约定主要约定两件事:1,参数入栈的顺序;2,函数调用结束后,谁(调用者or被调用者)来恢复栈。具体参考博客:点击打开链接转载 2016-05-07 10:13:42 · 1957 阅读 · 0 评论 -
gcc 、 g++ 、 mingw比较
gcc和g++都是GNU(组织)的一个编译器。误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。2.编译阶段,g++会调用gcc,对于c++代码,两者转载 2016-05-26 10:01:18 · 11197 阅读 · 0 评论 -
VC++文件操作之”获取文件大小“和”读文件“
本文分别转载自以下两篇博客:C++读文件详解windows获取文件大小的4种方法 在此主要讲一下纯c++获取文件大小和读二进制文件:在二进制文件中,使用>,以及函数(如getline)来操作符输入和输出数据,没有什么实际意义,虽然它们是符合语法的。文件流包括两个为顺序读写数据特殊设计的成员函数:write 和 read。第一个函数 (write) 是o转载 2016-04-27 17:00:19 · 1979 阅读 · 0 评论 -
CString、TCHAR*、char*互转
原文:点击打开链接/* *********************************************************************** * 函数: TransCStringToTCHAR * 描述:将CString 转换为 TCHAR* * 日期:*****************************************************转载 2016-04-27 10:30:39 · 456 阅读 · 0 评论 -
C++打印日志功能设计
我之前用Qt框架下,设计了一个“打印日志”的功能(点击打开链接),利用了Qt框架的一些机制,并调用了一些的Qt框架函数。现在,我需要编写一个纯C++的“日志打印”功能。(事实上,还是调用了一些windows系统函数)一、日志打印函数 我设计的是一个全局函数,而不是一个全局变量来实现log文件管理和输出。全局变量会导致“不可重入”,在多线程环境下,会概率性打印出错。原创 2016-04-14 19:20:49 · 2210 阅读 · 0 评论