C/C++
文章平均质量分 50
记录分享C/C++的技术细节
量子孤岛
90后嵌入式工程师,喜欢写作、读书。希望通过文字和大家共同进步!
展开
-
如何在MFC中添加一个线程
如何在MFC中添加一个线程原创 2022-07-17 15:57:49 · 612 阅读 · 0 评论 -
如何判断大小端?(C语言实现)
大端模式:是指数据的高字节保存在内存的低地址中;小端模式:是指数据的高字节保存在内存的高地址中。原创 2021-12-12 14:52:05 · 1517 阅读 · 1 评论 -
一图看懂结构体对齐
一图看懂C语言结构体对齐为什么需要结构体对齐?根本原因在于CPU访问数据的效率问题。不是所有的硬件平台都能访问任意地址的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据的,否则抛出异常。数据结构(尤其是栈)应尽可能在自然边界上对齐,因为在访问为对齐的内存时,处理器需要访问多次,而对齐的内存处理器只需要访问一次。对齐原则以 #pragma pack(x) 中 x 的大小和结构中占用空间最大的成员做比较,取小值为 n(外对齐依据)以 n 值和结构体每个成员比较,得出结果列表为 m[x原创 2021-11-20 22:01:24 · 353 阅读 · 0 评论 -
一款练习汇编的神器——DosBox
往期回顾CPU的“三条”总线物理地址是怎么确定的?以8086为例前面两节简单地阐述了CPU和内存如何通信以及物理地址的确定方法。今天开始实战演练下如何操纵寄存器和内存,因为岛主是基于8086来学习的汇编,先不谈Linux,这里我们借助一款神器来通透的观察寄存器和内存——DosBox。DosBox体验一个裸机的环境,在一个没有操作系统的环境中直接对硬件编程是很酷的一件事情。学习汇编需要使用debug来帮助我们更好地了解计算机系统。王爽老师的《汇编语言》上级环境使用的是dos系统,我们现在一般不会装d原创 2021-11-20 10:42:25 · 2650 阅读 · 0 评论 -
结构体初始化的四种方法
结构体初始化的四种方法从事嵌入式开发后开始使用C来编程。刚开始觉得非常拧巴,经常阅读C代码也就慢慢习惯了。由于没有类的概念,结构体在C中大量使用,今天聊聊结构体变量初始化的四种方法。C语言中结构体初始化的四种方法举例: typede struct block { char name[32]; int type; int size; }block;方法一:定义时赋值 block test = {"version", 1, 32}; 需要注意对应的顺序,不能错原创 2021-11-20 09:01:55 · 46482 阅读 · 3 评论 -
链队列实现字符串的读写
#include <stdio.h>#include <stdlib.h>#include <string.h>#define ERROR -1#define OK 0typedef char* ElemType;typedef struct Qnode{ ElemType data; struct Qnode* next;}Qnode, *QnodePtr;typedef struct LinkQueue{ Qnode* front;原创 2020-09-27 23:33:21 · 293 阅读 · 0 评论 -
最大公约数和最小公倍数的极简代码
最小公倍数int lcm(int a, int b){ for (int i = a;; i++) if (i % a == 0 && i % b == 0) return i;}最大公约数int gcd(int a, int b){ for (int i = a; i; i--) if (a % i =...原创 2019-11-14 15:01:46 · 442 阅读 · 0 评论 -
计算时间差值的方法
题目读取四个整数A,B,C,D,用来表示游戏的开始时间和结束时间。其中A和B为开始时刻的小时和分钟数,C和D为结束时刻的小时和分钟数。请你计算游戏的持续时间。比赛最短持续1分钟,最长持续24小时。输入格式共一行,包含四个整数A,B,C,D。输出格式输出格式为“O JOGO DUROU X HORA(S) E Y MINUTO(S)”,表示游戏共持续了X小时Y分钟。数据...原创 2019-11-04 19:30:08 · 940 阅读 · 0 评论 -
三个数排序的极简方法
三个数按大小排序#include <iostream>int main() { int a, b, c; std::cin >> a >> b >> c; if (a < b) std::swap(a, b); if (a < c) std::swap(a, c); if (b < c) ...原创 2019-11-04 14:43:25 · 1561 阅读 · 0 评论 -
c++ bitse用法
c++ bitse用法bitset类似于数组结构,但是它的每一个元素之能是0或1,每个元素仅用1bit空间。应用是须加入#include <bitset>1. 构造函数 bitset<10> bitset1; // 无参构造,默认都是0 bitset<10> bitset2(8); // 二进制保存,前面补0 string s = "1001";...原创 2019-05-25 19:39:33 · 409 阅读 · 0 评论 -
利用容器创建多个线程
利用容器创建thread对象数组,从而创建多个线程举例:#include <iostream>#include <vector>#include <algorithm>#include <thread>#include <mutex>using namespace std;void myprint(int inum){...原创 2019-05-25 15:12:16 · 324 阅读 · 0 评论 -
C++ unordered_map用法
基本操作引用头文件(C++11):#include <unordered_map>定义:unordered_map<int,int>、unordered_map<string, double>…插入:例如将(“ABC” -> 5.45) 插入unordered_map<string, double> hash中,hash[“ABC”]=5...转载 2019-04-28 19:34:44 · 5214 阅读 · 0 评论 -
C++笔试题目(持续更新)
C++笔试题目C和C++中struct有什么区别?Protection行为能否定义函数C无否,但可以有函数指针C++有,默认是****private可以C++中virtual与inline的含义分别是什么?虚函数的特点:如果希望派生类能够重新定义基类的方法,则在基类中将该方法定义为虚方法,这样可以启用动态联编。内联函数的特点;使用内联函数的...原创 2019-04-13 08:10:09 · 193 阅读 · 0 评论 -
多线程的数据共享保护案例
前言假设有一个网络游戏服务器,创建了两个线程:一个线程收集玩家命令(数字表示),并把命令数据写到队列中;取出队列中玩家发送的命令并进行解析,最后执行玩家需要的动作。mutex互斥量:使用lock()和unlock()// 用成员函数作为线程函数class A {public: // 入队操作 void inmsgRecvQueue() { for (int i = 0; ...原创 2019-08-28 22:01:07 · 285 阅读 · 0 评论 -
C++11创建线程的三种方式
通过类对象创建线程class CObject{public: void operator ()() { cout << "线程开始运行" << endl; cout << "线程结束运行" << endl; }};int main(){ CObject obj; std::thread my2Obj(obj); // ...原创 2019-04-03 08:30:06 · 6448 阅读 · 1 评论 -
C++中的float/double不能直接和0比较
举个例子bool func(double a, double b, double& c){ if (b == 0) return false; c = a / b; return true;}int main(int argc, const char** argv){ double a = 19, b = 0, c = 0; bool res = func(a, b,...原创 2019-05-22 19:24:23 · 4910 阅读 · 0 评论 -
c_str()的用法
c_str()就是将C++的string转化为C的字符串数组,c_str()生成一个const char *指针,指向字符串的首地址。char *p=s[10];string a=“welcome”;strcpy(p,a.c_str());cout<<p;结果为"welcome".这里其实做了一个隐式转换,即从char* -> const char*string ...原创 2019-08-24 09:13:28 · 1763 阅读 · 0 评论 -
Leetcode多线程
1114. 按序打印原题链接class Foo {public: Foo() { m2.lock(); m3.lock(); } void first(function<void()> printFirst) { printFirst(); m2.unlock(); ...原创 2019-08-12 20:23:34 · 364 阅读 · 0 评论 -
C++ STL
C++ STLvector, 变长数组,倍增的思想size() 返回元素个数empty() 返回是否为空clear() 清空front()/back()push_back()/pop_back()begin()/end()[]支持比较运算,按字典序pair<int, int> first, 第一个元素second, 第二个元素支持比较运算,以fir...原创 2019-09-10 20:41:38 · 524 阅读 · 0 评论 -
字符串需要注意的一些细节
输入字符串中带空格 使用getline(cin, s);其中需要包含头文件#include <string>使用toupper()或tolower()将字符转换大小写数字数组排序后去重sort(arr.begin(), arr.end());arr.erase(unique(arr.begin(), arr.end()), arr.end());相同字符串str1....原创 2019-09-13 15:42:06 · 334 阅读 · 0 评论 -
多线程中的互斥锁
互斥量mutex类对象,理解成一把锁,多个线程尝试用lock()成员函数来对其加锁,只有一个线程能够锁定成功lock( ) 与unlock( )须成对存在,很容易出问题, 所以引入**std::lock_guard()**类模板,对于忘记添加unlock(),会自动添加,类似于智能指针的功能。锁住的代码量多少成为粒度的粗细,粒度越细,代码执行效率越高。死锁至少有两个互斥量(锁头)才会产...原创 2019-09-23 17:16:49 · 431 阅读 · 1 评论 -
C++实验——搬砖问题
现有n块砖,要由n人一次搬完,假定男人一次可以搬4块,女人一次可以搬3块,两个小孩搬1块,计算这n人中男人、女人和小孩的人数。输入人数和砖数n,输出可能的解决方案。程序运行结果如下:50men0women10children40men5women3children42如果没有满足的情况,显示提示信息“no result!”程序运行结果如下:1no result!程序如下:#include <...原创 2018-04-02 21:13:12 · 6279 阅读 · 1 评论 -
c++打开图片查看器并查看图片
#include <shellapi.h>…… ::ShellExecute(NULL,L"open",_T("rundll32.exe"),_T("shimgvw.dll,ImageView_Fullscreen picture.bmp"),NULL,SW_SHOWNORMAL); 这将打开Windows默认照片查看器中的图片。 在picture.bmp的地方,填写需要传递完...原创 2019-04-10 22:38:59 · 4853 阅读 · 1 评论 -
C/C++的函数指针
函数指针指向的是函数而非对象,和其他指针一样,函数指针指向某种特定类型,函数的类型由它的返回类型和形参类型共同决定,与函数名无关。bool LengthCompare(const string &,const string &)该函数的类型是bool(const string& ,const string&)。想要声明一个指向改函数的指针,只需要用指针特换函数...原创 2019-04-06 08:46:54 · 123 阅读 · 0 评论 -
C++——求展开式问题
求展开式问题 关于展开式的问题,要先找到递推公式,找到每一项的通项,然后累加或累乘,利用循环语句,程序如下:while语句实现do-while语句实现2.计算实数n次方根(循环语句搭配判断以及break和continue) ...原创 2018-04-02 21:18:34 · 694 阅读 · 0 评论 -
C++实验——参赛歌手计算平均分问题:去掉一个最高分,去掉一个最低分,将剩下分数的平均值作为选手的最后成绩。这里假设共有10位评委,都是按照百分制打分。
话不多说,先上我写的代码然后讨论://歌唱大赛选手成绩计算 //去掉一个最高分,去掉一个最低分,将剩下分数的平均值作为选手的最后成绩。这里假设共有10位评委,都是按照百分制打分。#include <iostream>#include <string>const int Arsize = 10;int main(){ using namespace std; ...原创 2018-03-24 15:54:32 · 17769 阅读 · 0 评论 -
C++实验——一元二次方程问题
今天是2018年3月24日,我在大连,阳光明媚的一天。我决心开始我的CSND博客之旅,在这个大神云集的平台,唯有勤奋方能弥补我的愚钝。我的编程能力现在基本停留在小学生水平,但是研究生阶段我了解了机器视觉,而且很感兴趣,我回顾以前的在校生活,从没有过一个清晰的目标去奋斗,如今我找到了。我要走下去,我要努力成为一代大神,去造福社会。首先我的当务之急是把C++熟练,我知道这并非一日之功,需要日积月累,所...原创 2018-03-24 12:02:09 · 862 阅读 · 1 评论 -
C++实验——简易计算器(+-*/)
//简易计算器#include <iostream>#include <cmath>#include <string>int main(){ using namespace std; double num1, num2; char op; double result; string caption1("Error!Divided by 0!\...原创 2018-03-24 12:30:19 · 4006 阅读 · 1 评论 -
C++实验——自幂数(数学黑洞你怕不怕)
何谓自幂数,即n位正整数,各位的n次幂相加还等于这个数本身。n=1,称为独身,0~9均为自幂数;n=2,没有自幂数;n=3,水仙花数,如153;n=4,四叶玫瑰数;n=5,五角星数;n=6,六合数;n=7,北斗七星数;n=8,八仙数;n=9,九九重阳数。这其实在深究上升到了数学黑洞的概念——对于数学黑洞,无论怎样设值,在规定的处理法则下,最终都将得到固定的一个值,再也跳不出去了,就像宇宙中的黑洞可...原创 2018-03-24 12:48:06 · 5287 阅读 · 1 评论 -
C++实验:凯撒加密
恺撒加密法加密规则:将原来的小写字母用字母表中其后面的第3个字母的大写形式来替换,大写字母按同样规则用小写字母替换,对于字母表中最后的三个字母,可将字母表看成是首未衔接的。如字母c就用F来替换,字母y用B来替换,而字母Z用c代替。编程实现以下功能:输入一个字符串,将其加密后输出。#include<iostream>using namespace std;int main(){ ...原创 2018-04-08 14:59:20 · 5609 阅读 · 0 评论 -
冒泡排序法(C++实现)
看图秒懂代码!原创 2018-04-07 16:09:02 · 116802 阅读 · 31 评论 -
C++枚举类型实验:三色球问题
口袋中有红、黄、蓝3种颜色的小球,如果每次从口袋中取出2种不同颜色的小球,编写程序,打印出每种组合。#include <iostream>#include <string>using namespace std;int main(){ enum color { red, yellow, blue }; int temp, i, j; for (i = red;...原创 2018-04-07 15:58:47 · 2352 阅读 · 0 评论 -
C++实验:简易通讯录
编写程序,按照通讯录格式录入联系人信息并按照输入的反序显示联系人信息。通讯录内容要求:姓名性别联系电话1联系电话2#include <iostream>#include <string>using namespace std;int main(){ struct telelist { string name; string sex; string n...原创 2018-04-07 15:42:33 · 704 阅读 · 0 评论 -
C++异常处理
处理除零异常#include<iostream>using namespace std;int divide(int x, int y) { if (y == 0){ throw x; } return x / y;}int main(){ try{ cout << " divide(1, 2):\t" << divide(1, 2...原创 2019-04-03 20:59:47 · 335 阅读 · 0 评论 -
库函数qsort、bsearch、snprintf
1.qsort库函数——数组排序void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void , const void))base – 指向要排序的数组的第一个元素的指针。nitems – 由 base 指向的数组中元素的个数。size – 数组中每个元素的大小,以字节为单位。compar –...原创 2019-03-13 18:33:06 · 138 阅读 · 0 评论 -
使用copy()、ostream_iterator和reverse_iterator实现正反向输出
迭代器是STL算法的接口,而指针是迭代器,所以STL算法可是实现指针来对基于指针的非STL容器进行操作,例如数组。#include <iostream>#include <vector>#include <iterator>int main(){ using namespace std; int casts[10] = { 1,2,3,4,5...原创 2019-03-15 11:02:06 · 248 阅读 · 0 评论 -
C++生成随机数
产生随机数的用法给srand()提供一个种子,它是一个unsigned int类型;调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到RAND_MAX之间);根据需要多次调用rand(),从而不间断地得到新的随机数;无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。include <iostream>...原创 2018-12-21 09:53:32 · 264 阅读 · 0 评论 -
C++输出平行四边形和菱形
#include&lt;iostream&gt;int main(){ using namespace std; const int N = 4; //前四行 for (int i = 1; i &lt;= N; i++) { for (int j = 1; j &lt;= 30; j++) //在图案左侧空30列 cout &lt;&lt; " ";原创 2018-10-16 15:19:52 · 7149 阅读 · 0 评论 -
二进制数的编码:原码、反码和补码
一个数在计算机内的表达形式称为“机器数”,而它代表的数值称为机器数的“真值”。常用编码有原码、反码和补码。原码将符号位数字化0或1,数的绝对值与符号一起编码,即“符号-绝对值表示”。X = +0101011 ------------------&gt; [X]原 = 00101011X = -0101011 -------------------&gt;[X]原 = 10101011...原创 2018-10-15 15:00:56 · 7690 阅读 · 1 评论 -
数据的共享与保护之----标识符的作用域和可见性
作用域讨论的是标识符的有效范围,可见性讨论的是标识符是否可以被引用.二者相互联系又存在着很大差异.作用域作用域是标识符在程序中有效的区域.分为以下四种:函数原型作用域 局部作用域 类作用域 命名空间作用域1.函数原型作用域即函数形参的作用范围,只在左右括号之间.例如:double area(double radius); radius作为标识符,其作为形参的作用范围就...原创 2018-09-18 16:15:34 · 351 阅读 · 0 评论