C/C++
一只笨鸟
勤能补拙,笨鸟先飞!
展开
-
KEIL5(MDK5)出现能正常下载程序但不能硬件仿真的问题的解决办法
KEIL5(MDK5)出现能正常下载程序但不能硬件仿真原创 2022-10-10 16:13:53 · 3980 阅读 · 3 评论 -
C程序中的封装(转载)
写C代码的时候,最头疼的事情是哪些信息要暴露给外界,哪些隐藏在模块自身。如果不能处理好封装,那么久而久之,代码就自然演进成互相缠绕的意大利面条,不利于后期维护升级。转载 2022-06-25 20:34:49 · 1246 阅读 · 0 评论 -
C语言中位段实际运用
#include <QCoreApplication>//#pragma anno_unions //如果出现报错,共用体可能不支持匿名结构嵌套typedef union{ unsigned char BYTE; struct { unsigned char B0: 1; unsigned char B1: 1; unsigned char B2: 1; unsigned char B3: 1; .原创 2021-07-16 17:46:42 · 363 阅读 · 0 评论 -
C语言复杂类型声明如何解读
复杂类型的说明:从变量名处起,根据运算符优先级结合,一步一步分析。下面以一个比较复杂的类型(int * (*p(int))[ ])为例:第一步,p先与()结合,说明是一个函数,第二步,()内有一个int,说明函数有一个形参为int型,第三步与*结合,说明返回的是一个指针变量,第四步与[ ]结合,说明该指针变量指向数组,第五步再与*结合,说明数组中的元素为指针型,第六步说明数组中的指针元素的类型为int型,结论,所以这是:返回一个由整型指针变量组成的数组的指针变量的函数,函数入参原创 2021-02-24 16:57:17 · 468 阅读 · 0 评论 -
有符号与无符号比较原理分析
今天空了又重温了一下C,针对之前强哥提的问题,我仔细想了下,举个例子:假如当前buff[1]=0111 1111B; buff[2]=1000 0000B;buff定义为char类型,一般系统隐含为signed char,执行buff[1] == ~buff[2]运算时,buff[1]由signed char自动转化为int,又因buff[1]符号位为0,则高位补0,结果为00000000 00000000 00000000 01111111B;buff[2]由signe...原创 2021-02-07 17:06:18 · 479 阅读 · 0 评论 -
HAL库回调函数自定义版本注意问题
HAL库回调函数自定义版本void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){}如果未使用入参huart,会被编译器优化,仍然使用其__weak版本。注意哦!!!!原创 2020-12-24 16:19:27 · 419 阅读 · 1 评论 -
SPI读写函数寄存器版本(STM32F1xx,STM32F7xx实测完美)
void SPI_ReadWriteByte(SPI_TypeDef *spi,unsigned char *pTxData, unsigned char *pRxData, unsigned short Size)//寄存器版本{ volatile unsigned char tmpreg; unsigned short TxXferCount,RxXferCount; unsigned char *pRxBuffPtr = pRxData; unsigned char .原创 2020-12-07 15:30:34 · 1549 阅读 · 0 评论 -
MDK调试进入B .挂起时可能出现的问题
原创 2020-12-01 13:42:50 · 1154 阅读 · 2 评论 -
source insight3.5 相对路径(保证可行)
source insight 相对路径source insight项目移动到另外一个地方时,会因为之前是绝对路径而导致项目中的文件都不可用,需要重新把这些文件添加一遍。解决办法为创建项目时设定为相对路径。我的项目路径:方法为:1、创建source insight项目,在创建时设定为“项目文件有自己的配置文件”,点击 “确定”;2、不添加任何的项目文件,直接点“关闭”;3、在菜单“Project\Project settings”中修改“Project Source D原创 2020-10-23 16:06:19 · 1136 阅读 · 1 评论 -
浮点数内存布局(精华版)
1.float和double的范围和精度(1)float和double的表示范围是由指数的位数来决定的。float的指数位有8位,而double的指数位有11位,分布如下:float:1bit(符号位)+8bits(指数位)+23bits(尾数位)double:1bit(符号位)+ 11bits(指数位)+ 52bits(尾数位)(2)在数学中,特别是在计算机相关的数字(浮点数)问题的表述中,有一个基本表达法: (浮点)数值 = 尾数 × 底数 ^ 指数,(附加正负号)...原创 2020-10-15 17:04:53 · 1408 阅读 · 0 评论 -
STM32串口空闲中断--我入的一个坑
串口使能后,如果关闭接收,再重新打开,空闲中断标志会被置位,再关闭接收,再重新打开,空闲中断标志又会被置位,如此反复。。。切记重新打开串口接收,马上清空闲中断标志(如果要使用空闲中断),否则会一直进入空闲中断!...原创 2020-09-15 09:07:59 · 5762 阅读 · 2 评论 -
STM32串口通信原理及HAL库代码stm32f1xx_hal_uart.c阅读分析
原理性说明://参考网址:https://blog.csdn.net/u010561799/article/details/89526266在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空(单字节),另一个是TC=发送结束(多字节)。当USART_DR中的1字节...原创 2019-11-29 11:00:10 · 3279 阅读 · 1 评论 -
STM32的USART发送数据时如何使用TXE和TC标志【标准库】
http://bbs.21ic.com/icview-2514168-1-1.html转载 2019-11-28 09:07:21 · 647 阅读 · 0 评论 -
宽字符wchar_t和窄字符char区别和相互转换
宽字符wchar_t和窄字符char区别和相互转换1. 首先,说下窄字符char了,大家都很清楚,就是8bit表示的byte,长度固定。char字符只能表示ASII码表中的256个字符,包括前128个可见字符和后面的128个不可见字符。 而wchar_t则是因为char所能表示的字符数太少(256个)而应运而生的,它的长度可以8bit,16bit,32bit,长度转载 2015-09-09 11:40:42 · 578 阅读 · 0 评论 -
unicode和多字节字符集的区别
编码指不同国家的语言在计算机中的一种存储和解释规范 ANSI与ASCII :最初,Internet上只有一种字符集——ANSI的ASCII字符集(American Standard Code for Information Interchange, “美国信息交换标准码),它使用7 bits来表示一个字符,总共表示128个字符,后来IBM公司在此基础上进行了扩展,用8bit来表示一个字符,总共转载 2015-09-09 11:12:50 · 722 阅读 · 0 评论 -
关于VC多字节字符集和unicode宽字符集的使用和问题,只有明白了其中的原理,才能灵活解决问题
关于VC多字节字符集和unicode宽字符集的使用和问题,只有明白了其中的原理,才能灵活解决问题VC在建一个新的项目时,都是默认Unicode字符集。字符集不仅涉及编码,还涉及字符字节的物理存储方式,常常成为宽字符unicode字符集和窄字符(gb2312)多字节字符集 UTF-8: 1~3字节可变UNICODE: 2字节一个字符 单个字符宽度固定。GB2转载 2015-09-09 11:17:01 · 1900 阅读 · 0 评论 -
将char*转换为wchar_t*
wchar_t c[15];char mc[]="我喜欢你I love you";size_t nu = strlen(mc);size_t n =(size_t)MultiByteToWideChar(CP_ACP,0,(const char *)mc,(int)nu,NULL,0);c[n]=0;MultiByteToWideChar(CP_ACP,0,mc,nu,c,转载 2015-09-09 10:17:47 · 616 阅读 · 0 评论 -
将字符串转换为16进制的字符串(常用在串口编程中)
string StringToHex(LPCSTR lpSrc, char chTag = 0){//将字符串转换为16进制的字符串; chTag为分界符,如果为0x20表示空格string strDest;unsigned char* pSrc = (unsigned char*)lpSrc;char buf[2];long dwSize = strlen(lpSrc)转载 2015-09-16 17:10:46 · 1902 阅读 · 0 评论 -
MFC中怎样检测电脑设备管理器中的串口是否存在?
怎样检测电脑的串口是否存在?程序在初始化的时候,自动检测系统的串口是否存在或者被占用,可以使用如下的方法:在基于对话框的设计中,我们采用MSComm控件作为串口接口使用,但该控件没有提供检测所使用串口是否存在的函数,所以我们在程序初始化的时候如果使用了系统中不存在的串口(如,在有些笔记本中,COM1是不存在的),系统会异常,造成系统初始化不正常。为了解决这个问题,同时使我们的程序有更好的交转载 2015-09-16 09:13:25 · 4264 阅读 · 0 评论 -
Cstring中GetBuffer()方法的主要作用
Cstring中GetBuffer()方法的主要作用GetBuffer()主要作用是将字符串的缓冲区长度锁定CString::GetBuffer有两个重载版本:(1)LPTSTR GetBuffer( );(2)LPTSTR GetBuffer(int nMinBufferLength)①在第二个版本中,当设定的长度小于原字符串长度时,nMinB转载 2015-10-21 14:51:43 · 1271 阅读 · 0 评论 -
SetFilePointer设置文件指针使用示例(可用于读取大文件!!!)
SetFilePointer设置文件指针使用示例#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]){ _tsetlocale(LC_CTYPE, _T("")); HANDLE hFile; CHAR buffer[256] = {}; DWORD nByte;转载 2015-10-26 14:38:11 · 3794 阅读 · 0 评论 -
Invalidate和UpdateWindow,UpdateData区别联系
Invalidate和UpdateWindow的区别按引:Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。而UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最多只有一条)的无效区。效果很明显,调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用转载 2015-10-29 14:58:59 · 986 阅读 · 0 评论 -
C语言结构体中的函数指针
C语言结构体中的函数指针结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展。那么,我们在C语言的结构体中,只能通过定义函数指针的方式,用函数指针指向相应函数,以此达到调用函数的目的。1. 函数指针一般的函数指针可以这么定义:int(*func)(int,in转载 2016-02-03 09:57:17 · 817 阅读 · 0 评论 -
_T("")的由来及意义
C++支持两种字符串,即常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包裹),这样对应的就有了两套字符串处理函数,比如:strlen和wstrlen,分别用于处理两种字符串。 微软将这两套字符集及其操作进行了统一,通过条件编译(通过_UNICODE和UNICODE宏)控制实际使用的字符集,这样就有了_T("")这样的字符串,对应的就有了_tcslen这样的函数。转载 2016-04-12 09:41:27 · 840 阅读 · 0 评论 -
MultiByteToWideChar和WideCharToMultiByte用法详解
MultiByteToWideChar和WideCharToMultiByte用法详解标签: translationwincenull语言bufferdelete2012-03-22 14:12 7510人阅读 评论(0) 收藏 举报 分类: 编码(20) 版权声明:本文为博主原创文章,未经博主允许不得转载。部分参考:转载 2016-04-11 11:51:31 · 335 阅读 · 0 评论 -
谈谈基类与子类的this指针(C++)
谈谈基类与子类的this指针(C++)引入 定义一个类的对象,首先系统已经给这个对象分配了空间,然后会调用构造函数(说明:假设存在构造函数)。一个类有多个对象,当程序中调用对象的某个函数时,有可能要访问到这个对象的成员变量。而对于同一个类的每一个对象,都是共享同一份类函数。对象有单独的变量,但是没有单独的函数,所以当调用函数时,系统必须让函数知道这是哪个对象的操作,从而确定成转载 2016-04-19 14:26:31 · 3639 阅读 · 0 评论 -
WM_PAINT 消息与 OnDraw、OnPaint()
OnDraw只有CView才有,其他窗口都是在OnPaint里画。void CView::OnPaint(){// standard paint routineCPaintDC dc(this);OnPrepareDC(&dc);OnDraw(&dc);}这是MFC的代码,说明对于CView类,OnPaint会调用用户自己写的虚函数OnDraw;但是如果用户自己转载 2016-05-03 16:21:20 · 385 阅读 · 0 评论 -
关于Eclipse开发环境中编译器的设置
Eclipse PlatformVersion: 3.7.2Build id: I20110613-1736project-->properties,在C/C++build-->Tool Chain Editor,当current toolchain选择了Linux Gcc时,此刻C/C++build-->settings,tool settings默认是配置好了[有关原创 2016-05-20 10:25:57 · 20369 阅读 · 0 评论 -
结构体字节对齐
结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐。 内存对齐的原因:转载 2016-10-31 09:54:25 · 166 阅读 · 0 评论 -
Pragma Pack(n)与内存分配
#pragma pack(n)解释一:每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。 规则: 1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以转载 2016-10-31 10:19:36 · 224 阅读 · 0 评论 -
转-关于书上说的“编译的时候分配内存”
关于书上说的“编译的时候分配内存”一下均为网络上收集的资料: 1、所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以 明确计算出来,并且不会再改变,因此它们可以直接存放在可执行文件的特定的节里(而且包含初始化的值),程序运行时也是直接将这个节加载到特定的段中,不 必在程序运行期间用转载 2017-12-20 16:06:10 · 466 阅读 · 2 评论 -
(摘自C Primer)千万别解引用未初始化的指针
注:如果仅仅有int *pt; C编译器会报警;但是如果有*pt=5,则是运行时错误; int i;C编译器会报警;但是如果有*pt=5,则是运行时错误;转载 2017-12-21 13:31:39 · 535 阅读 · 0 评论 -
大端法、小端法、网络字节序
大端法、小端法、网络字节序 转关于字节序(大端法、小端法)的定义《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序;大端存在起始地址,即是大端字节序。 也可以说: 1.小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端转载 2017-11-15 17:07:16 · 321 阅读 · 0 评论 -
Struct 和 Union区别 以及 对内存对齐方式的说明
Struct 和 Union区别 以及 对内存对齐方式的说明转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458一、Struct 和 Union有下列区别:1.在存储多个成员信息时,编译器会自动给struct第个成员分配存储空间,struct 可以存储多个成员信息,而Union每个成员会用同一个存储转载 2018-01-02 09:53:28 · 970 阅读 · 0 评论 -
VC下位段(位域)对齐与应用
1.位域的声明位域变量的声明与结构变量声明的方式相同。 如:struct sample{ int a:7; //类型说明符 位域名:位域长度 int b:2; int c:6;}data;其中,data为sample变量,共占两个字节。其中位域a占第一个字节的7位,位域b占第二个字节的低2位,位域c占第转载 2018-01-02 10:40:58 · 303 阅读 · 0 评论 -
try catch throw用法
try catch throw用法要防止因为异常产生的内存泄漏,可以使用智能指针,也可以用 __try { } __finally { } 《Windows核心编程》一书第23~25章是很好的参考资料。----------------------------------------------------try,catch,throw:转载 2018-01-11 14:42:44 · 5770 阅读 · 0 评论 -
C/C++ char与wchar_t编码区别
一、GB2312(GBK 向下与 GB 2312 完全兼容,向上支持 ISO 10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用)兼容ASCII编码gb2312码由两个字节组成,每个字节都大于80H,ASCII码都小于80H,这样肯定没冲突下面是摘抄部分:(1)区位码先转换成十六进制数表示 (2)(区位码的十六进制表示)+2020H=国标码; (3)国标码+808转载 2017-12-27 09:20:06 · 1473 阅读 · 0 评论 -
C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。数据段 :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局转载 2017-12-27 11:24:51 · 257 阅读 · 0 评论 -
(转) char c=128;printf("%d",c);问题
(转) char c=128;printf("%d",c);问题一、文章来由同属计算机储存,补码问题的延生~~二、解密答案输出是-128,为什么呢?char型变量c中存储的是128的补码:10000000。上一篇文章已经说到,对于计算机来说,存储的都是数据的补码。赋值给char型,debug模式下反汇编如下:char c =转载 2017-12-19 14:25:52 · 3028 阅读 · 0 评论 -
(转)C语言 - 结构体所占字节数
(转)C语言 - 结构体所占字节数 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。转载 2017-12-08 10:47:52 · 709 阅读 · 0 评论