![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
Quan略略略
君子爱色取之有道
展开
-
【C语言】浮点数精度问题
浮点数精度问题。原创 2022-03-29 11:50:22 · 1122 阅读 · 0 评论 -
【C语言】printf函数陷阱
URL被编码/转义之后(转换工具地址:URL在线编码转换工具)字符串内容改变了,例如:&fm=217&app=126&f=JPEG?w=363&h=225&s=9转为:%26fm%3D217%26app%3D126%26f%3DJPEG%3Fw%3D363%26h%3D225%26s%3D9可以发现其中“&s=9”被转成了“%26s%3D9”,注意,“%26s”在printf格式化打印函数看来是一个参数,表示打印一个字符串,一共打印26个字符,原创 2022-03-03 10:46:37 · 702 阅读 · 0 评论 -
【C语言】堆内存调试追踪
#ifdef MEMORY_DEBUG#define MALLOC(_SIZE) malloc(_SIZE)#define FREE(_P) free(_P)#else#define MALLOC(_SIZE) malloc_debug(_SIZE, __MODULE__, __LINE__)#define FREE(_P) free_debug(_SIZE, __MODULE__, __LINE__)#endif原创 2021-12-29 15:14:45 · 919 阅读 · 0 评论 -
【Algo】快排第一趟
参考文章:快速排序算法(QSort,快排)及C语言实现上节介绍了如何使用起泡排序的思想对无序表中的记录按照一定的规则进行排序,本节再介绍一种排序算法 快速排序 (Quick Sort,简称快排) 。 C语言中自带函数库中就有快速排序qsorhttp://data.biancheng.net/view/71.html49,38,66,90,75,10,20...原创 2021-09-26 17:01:51 · 169 阅读 · 0 评论 -
【C语言】定义二维数组并不会在创建一个指针数组
突然感觉自己的C语言基础好差劲。定义一个二维数组:char a[8][64];又有两个函数定义如下:void testfun1(char **strings, int count);void testfun2(char strings[][64], int count);如果把数组a传入到 testfun1 中去,软件挂了。如果把数组a传入到 testfun2 中去,软件正常。定义数组a的时候,按照我原先的想法是会在内存中创建一个 char * 类型的数组,名字就叫a,.原创 2021-09-24 15:47:31 · 215 阅读 · 0 评论 -
【C语言】缺少GDB时的问题定位
#define MARK DUER_PRINT_FUN("MARK:[%s,%d]", __FUNCTION__, __LINE__);Crash在121行了。原创 2021-08-31 19:22:20 · 293 阅读 · 0 评论 -
【C语言】不合理的include顺序导致的问题
如下图,编译cmd_test.c 文件的时候先包含 cmd_test.h,然后cmd_test.h内部又包含了command.h,command.h内部包含scli.h,在scli.h里面又反过来包含了command.h,这种存在循环包含关系的容易出现错误。因为在前面已经包含过command.h,所以__LIBSCLI_COMMAND_H__这个宏就已经被定义过了,那么在处理scli.h头文件的时候command.h里面的内容就不会被包含了,这时候就会报错了。...原创 2021-08-12 11:25:32 · 541 阅读 · 0 评论 -
【C语言】预编译先于enum
C语言的预编译是先于enum,什么意思呢,看代码:#include <errno.h>#include <unistd.h>#include <string.h>#include <sys/ioctl.h>enum{ ENUM_ABC, ENUM_DEF,};#define DEF ENUM_DEF int main(int argc, char **argv){#if DEF == ENUM_ABC原创 2021-05-04 15:26:18 · 947 阅读 · 1 评论 -
【C语言】静态链接库文件(.a)和object文件(.o)区别
静态链接库(.a)文件其实就是将多个object文件(.o)文件打包成一份文件。链接过程可以使用.a或者.o文件。测试一下,三个文件 main.c / fun1.c / fun2.c 分别是:main.c:#include "stdio.h"int fun1(int b);int fun2(int b);void main(){ printf("%d,%d\r\n",fun1(12),fun2(12));}fun1.c:int fun1(int b){ return原创 2021-04-11 00:08:54 · 5364 阅读 · 0 评论 -
【C语言】嵌套if else的低级错误
下面的代码中,第二个 else if 会和中间的 if “结合”,而不是和第一个 else if “结合”,因此造成运行逻辑改变。不要被缩进给蒙蔽了双眼。 . . . else if(sw == CTRL_PREV) if(media_list_pos > 0) media_list_pos--; else if(sw == CTRL_START)原创 2021-04-01 14:15:43 · 1271 阅读 · 0 评论 -
【C语言】ASCII、GB2312以及UTF8编码格式
1. ASCII编码百度百科 - “ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符”ASCII码使用一个字节表示128种字符,其中0x00 ~ 0x1F是..原创 2021-03-25 11:08:39 · 3463 阅读 · 0 评论 -
【C语言】可变参数
实例://All the variable parameters have the type of "int"//sum: The only fixed parameter that indicates the number of variable parameters.//returns the summary of variable parameter.int sum(int num,...){ va_list ap; int sum = 0; int i;原创 2021-03-21 12:29:52 · 231 阅读 · 0 评论 -
【C语言】部分不能表示二进制数的编译器中如何表示二进制数
KEIL for 51和RealView MDK就不能使用类似 int a = 0b00010101; 以及 int a = 0b00010101B; 这样的表示二进制数的方法,有时候不方便。解决小技巧参考文章:http://ask.zol.com.cn/x/9159373.html#ifndef __BINARY_H__#define __BINARY_H__#define B32(...原创 2020-02-25 13:45:52 · 2210 阅读 · 0 评论 -
【C语言】有符号和无符号数的比较运算
int a = -1; unsigned int b = 1; if(a < b) printf("a < b\r\n"); else printf("a > b\r\n"); if(a < (int)b) printf("a < b\r\n"); else printf("a > b\r\n");运行结果:a &g...原创 2019-12-06 13:42:14 · 4344 阅读 · 0 评论 -
Linux下使用LCD5110显示中文(ASCII+GB2312字库)
关于如何在Linux下使用LCD5110参见另一篇blog:http://blog.csdn.net/tq384998430/article/details/53214273。在这篇博客的基础上需要添加屏幕绘点的函数:void LCD_DrawDot(int x,int y,int onoff){ int a = y / 8,b = y % 8; if(onoff) { LCD_B原创 2016-11-20 21:22:03 · 3955 阅读 · 0 评论 -
C语言使用联合体和位域让编译器进行位操作
联合体和位域的基本概念参考互联网,这种做法适合进行用在硬件寄存器操作的和通信协议栈管理上,可以很大程度的提高程序的可靠性和可阅读性。例如将单片机的每个寄存器定义成这种方式之后就可以使用运算符“.”对寄存器进行操作而不是使用易错难懂的类似“reg1 &= ~(1 << 8);”的与或操作(位带操作)。详细见下面的测试程序。#include "stdio.h"union test{ struc原创 2017-09-04 15:55:28 · 3182 阅读 · 0 评论 -
基于状态机State Machine的程序设计技巧②状态转移图和简单通信协议
基于状态机进行程序设计的第一步是要设计状态机的状态设计,然后基于设计的状态画状态转移图,所谓状态转移图就是用于描述说明状态机中各个状态之间的转移条件以及操作。下面使用状态机设计一个之前常用的通信协议,之前大量使用标志位的技巧,虽然也能实现给定的通信协议,但是稳定性、可移植性和可维护性较差,这里使用状态机的方式重写这个通信协议。 首先介绍一下这个通信协议,T作为帧起始字符,Q作为帧原创 2016-12-30 11:40:55 · 4838 阅读 · 0 评论 -
C语言定义 常量/变量 指针数组
例如:struct component{ int a; int b; int c;};struct component s1,s2,s3;struct component * const test1[] = { &s1, &s2, &s3,};const struct component * test...原创 2018-12-21 11:11:07 · 2183 阅读 · 0 评论 -
【C语言】二进制数中bit1的操作小伎俩
这里先做一个前奏:int a = 0xF0; //a = b1111 0000a = a & (a - 1); //a = b1110 0000a = a & (a - 1); //a = b1100 0000a = a & (a - 1); //a = b1000 0000a = a & (a - 1); //a = b...原创 2019-04-01 17:01:15 · 3740 阅读 · 2 评论 -
不使用if、?:、switch表达式求整数a、b两数中的较大值
对于这个题其实还可以加点要求:不使用< > <= >= 这四种判断表达式。否则可以直接简单的求解:int c;while(a > b){ c = a; goto end;}c = b;end:print(c);我想题目的本意不是这样的,那么不准使用< > <= >=如何求解呢?既然题目要求if、问好表达式、...原创 2019-04-02 10:04:54 · 1154 阅读 · 5 评论 -
真假币孰重孰轻?
这是一道算法题:现在有100个真币和1个假币混合在一起,真假币的唯一区别只在重量上,使用一个天平不使用砝码,如何只称量两次判断真假币哪个重哪个轻。下面是我想到的一个方案:将所有硬币分成A(33)、B(33)、C(33)、D(2)这四份,进行下面的操作:1、称量A、B,若A≠B,说明A或者B中有假币,C、D中都是真币。称量A、C,若A=C,说明A、C都是真币,B中有假币,这时候第一次称量...原创 2019-04-02 10:30:07 · 521 阅读 · 0 评论 -
C语言使用宏初始化结构体的问题
Linux内核源码中广泛的使用宏来进行结构体对象定义和初始化,但是进行对象初始化的时候需要注意宏参数和结构体成员名冲突的问题,下面进行简单测试说明,编写一个程序创建一个结构体,然后使用宏进行结构体初始化: 1 #include "stdio.h" 2 3 struct guy 4 { 5 int id; 6 char *name; 7原创 2017-08-07 14:32:32 · 5164 阅读 · 0 评论 -
C语言结构体对象间直接赋值
C语言中变量间互相赋值很常见,例如:int a,b;a = b;结构体也是变量(自定义变量),两个结构体之间直接赋值按道理应该也是可以的吧,说实话之前还从没遇到过将一个结构体对象赋值给另一个结构体对象的(见识太浅),那么下面做一个测试看看:#include "stdio.h"struct test{ int a; int b; int c; char *d;};原创 2017-08-03 10:20:29 · 11432 阅读 · 4 评论 -
C语言结构体对齐问题
C语言中为了保证结构体的运算速度,对结构体进行了对齐操作,默认对齐字节数是按照结构体中占用字节数最大的简单数据成员算的,结构体中的结构体不算是简单数据成员,简单数据成员包括char、int、short、long、long long、float、double以及他们的unsigned形式(如果有)。使用#pragma pack(n)可以让结构体按照指定的n字节对齐,但是如果n大于结构体中的最原创 2016-11-27 23:08:06 · 505 阅读 · 0 评论 -
什么是适配器?
什么是适配器?打个比方,手机要充电,市电是220V的交流电,而手机需要5V的直流电才能充电,所以不能直接将市电接到手机充电口上,那怎么办呢?这时候横空出世一个充电头,他的功能是将220V的交流电转变成5V的直流电,这样在市电和手机之间有了一个充电头的东西,这个东西就叫做适配器。简单的描述适配器就是“将两个不相关、不兼容、不搭配或者不相爱的东西连接在一起使得两者可以相关、兼容、搭配甚至相爱”原创 2016-11-23 09:48:49 · 2904 阅读 · 0 评论 -
C语言编译过程
1. 预处理(Preproceessing)预处理的过程主要处理包括以下过程:将所有的#define删除,并且展开所有的宏定义处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。删除所有注释 “//”和”/* */”.添加行号和文件标识,以便编原创 2016-11-22 18:38:48 · 556 阅读 · 0 评论 -
[原创] 删繁就简--1 bit的查找,看了白版主的0bit查找的感想
tqOS中使用了OsMapTable任务优先级映射表来查找最高有效位。这在8*8任务的系统中是可行的,需要的查找表有256个元素。但是如果进一步提升系统的最大可支持的任务数量,比如16*16最大支持256个任务的话,就需要查找表中有2^16=65535个元素,每个元素2个字节,也就是一共128KB......不可思议,所以如果扩展最大任务数量至16*16甚至是32*32,用查找表就不合适了。可以使原创 2016-11-22 18:36:32 · 606 阅读 · 0 评论 -
什么是回调(Callback)函数
回调函数参考:http://www.zhihu.com/question/198011311、“你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数原创 2016-11-22 18:34:07 · 878 阅读 · 0 评论 -
C语言结构体的对齐原则
原文:http://www.cnblogs.com/luxiaoxun/archive/2012/11/09/2762438.htmlC语言结构体的对齐原则Q:关于结构体的对齐,到底遵循什么原则?A:首先先不讨论结构体按多少字节对齐,先看看只以1字节对齐的情况:#include #include string.h>#define PRI转载 2016-11-30 16:39:57 · 566 阅读 · 0 评论 -
Linux下使用/dev/mem控制GPIO模拟SPI时序控制LCD5110
关于如何使用/dev/mem直接控制GPIO口参见我的另一篇博客:http://blog.csdn.net/tq384998430/article/details/53161192。这篇文章将使用GPIO的操作模拟出SPI时序来控制诺基亚LCD5110屏幕,关于该屏幕可以自行百度,网上资料很全。使用GPIO模拟SPI是单片机开发中常用的一种手段,GPIO还可以模拟IIC等总线的时序,可以用在没原创 2016-11-18 11:18:33 · 2812 阅读 · 0 评论 -
CRC16校验程序
CRC循环冗余校验原理参考:http://blog.csdn.net/liyuanbhu/article/details/7882789const uint16 wCRCTalbeAbs[] = { 0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, 0xA001, 0x6C00, 0x7800, 0xB401, 0x原创 2016-11-29 13:32:43 · 1563 阅读 · 0 评论 -
【C语言】MCU系统printf函数重写以及fputc重定向
参考:http://www.51hei.com/mcu/3429.html//将stdio.h头文件中的printf函数注释掉不然会冲突//stdio.h头文件还是要包含的里面有va_list的定义//使用vsprintf将要打印的数据赋给字符串//使用字符串发送函数发送字符串//不要把这个数组放在printf函数里面,一方面会在栈分配内存上耗费时间//另一方面也是最主要的如果栈空原创 2016-11-27 23:16:12 · 5069 阅读 · 1 评论 -
sourceInsight4 破解笔记(完美破解)
转自:http://www.cnblogs.com/Napoleon-Wang/p/6706773.html时隔好多年,sourceinsight4以迅雷不及掩耳之势的来了。与3.5相比,sourceinsight4多了代码折叠以及文件标签功能,可谓是让sourceinsight迷兴奋了好几晚上。废话不多说,来说说破解的事儿。(仅供学习,商业用途,请购买正版)网上大多数转载 2017-08-16 20:04:36 · 638 阅读 · 0 评论 -
BASE64编码、解码的C语言实现
原文:http://www.cnblogs.com/yejianfei/archive/2013/04/06/3002838.htmlBASE64是一种基于64个可打印字符来表示二进制数据的表示方法。由于26=64,所以每6位为一个单位,对应某个可打印字符。三个字节共24位,对应于4个base64单位,即3个字节需要用4个可打印字符来表示。它常用来作为电子邮件的传输编码。在ba转载 2017-07-06 14:20:26 · 498 阅读 · 0 评论 -
C语言的数组和指针
今天遇到一个二级指针的问题,突然对C语言的数组和指针感觉迷糊了,下面整理一下。定义一个数组:int buff[1024]; 数组的起始地址假设为0x0000。定义一个指针:int *p; 指针变量的存储地址假设为0x0100。访问数组buff的第一个字节的方式为:buff[0] 相当于 *(buff + 0)。访问指针p指向的数据的方式为:*(p)。原创 2017-06-14 10:21:33 · 1028 阅读 · 0 评论 -
C语言内置宏的使用
#include #include void main() { printf("代码在 %d 行\n", __LINE__); printf("代码编译的时间%s %s\n", __DATE__, __TIME__); printf("文件名 %s\n", __FILE__); printf("函数名 %s\n",原创 2017-06-06 14:02:11 · 593 阅读 · 0 评论 -
一个最简单的加密解密算法(人人能懂)
原文:http://blog.csdn.net/stpeace/article/details/8294980 点击打开链接[cpp] view plain copy#include // KEY 非常重要,不能对公众泄露KEY值 // 发送端和接收端提前秘密约定好KEY值 #define KEY 1313113 //转载 2017-03-28 11:33:18 · 5613 阅读 · 0 评论 -
C语言逗号表达式
c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两式联接起来,如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14,(a=3*5,a*4)的值是60,原因在于赋值运算优先级高于逗号表达式。表达式1,表达式2,表达式3,...... ,表达式n逗号表达式的要领:(1) 逗号表原创 2017-02-28 09:20:57 · 1001 阅读 · 0 评论 -
基于状态机State Machine的程序设计技巧①
第一次接触到状态机这个词是在学习FPGA的过程中,传统的CPU在处理任务的时候是进行串行工作的,而FPGA内部则是并行处理任务,所以进行FPGA的程序设计是十分注重同步,这里说的同步不是同时做事情,而是有纪律地做事情,引用百度百科上对同步的解释:同步指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。使用最多的同步方式就是状态机State Machine,虽然我对FPGA只有很浅薄的原创 2016-12-29 15:31:09 · 1662 阅读 · 0 评论 -
C语言中的rand函数和srand函数
C语言中的rand函数和srand函数:只能产生伪随机数,最多也只是提高模拟的程度而已,rand函数内部管理着一个计数单位,程序每调用一次,它就根据这个计数单位和对应的srand产生种子的值,经过一系列的运算,得到随机值,其实就相当于你传了2个参数给rand(),比如是x是计数器的值,y是srand的值,那么:rand() = x*2 + y ,举个简单的例子,实际可能比这个关系式要复杂对于给定的原创 2016-11-27 23:21:38 · 3677 阅读 · 0 评论