DevC++ easyx实现图片拖动,一种悬浮窗实现原理与完整代码

 

翻出来之前写的代码,

EasyxDevC++开发地图编辑和游戏编辑代码工程文件附注释_哔哩哔哩_bilibili

每次把代码备份下来,等着有一天能够复用代码,产生新的价值。 

结果最近这几天才来回顾记录emm

“这是怎么搓出来的?”从10行代码到400行代码的小工程,无中生有的各版本备份——EasyxDevC++开发地图编辑和游戏编辑代码开发过程代码附注释_哔哩哔哩_bilibili

虽然视频简介里把资源代码网盘链接传了,鄙人的CDSN主页也一块上传了相同的资源。 但是没有讲解,素材硬看也是消耗比较大的,价值再次产生和无中生有价值,这两个讲解方式应该不同。一个是面向穷举,一个是马后炮解释和背景思路介绍。

使用方式如视频“这是怎么搓出来的?”从10行代码到400行代码的小工程,无中生有的各版本备份——EasyxDevC++开发地图编辑和游戏编辑代码开发过程代码附注释_哔哩哔哩_bilibili

视频简介里的各种链接都已经提出相应问题的解决方案。

这次来实现一个悬浮窗,这是在开发绘图板的两周共30小时,解决生成的瓦片图片要拖动指定区域的问题。这就是自热而然的背景。

操作:

长按鼠标左键,点亮黄色的像素点。

按住Ctrl+鼠标左键,长按点击黑色图片就能拖动图片了。

效果如图

 

原理:放置原像,扫描保存,粘贴新像。

上代码,看注释,具体说明 

完整代码,新建项目,复制粘贴直接跑。代码出处是图中序号9.的文件(9.拖动而且能画画)

#include<stdio.h>
#include<conio.h>
#include<graphics.h>

//void draw(struct Exmessage m){
//
//}
void move(struct ExMessage m) {
	
	static	IMAGE img2;
//	getimage(&img2,100,100,200,200);
//	检测
	static	IMAGE img3;
	static	int x=100,y=100;
	static  int px=0,py=0;
	static int flag=0;
	if(flag==1) {
		BeginBatchDraw();
		putimage(x,y,&img3);
//			在原位置恢复底层
		getimage(&img3,m.x+px,m.y+py,200,200);
//			获取原位置和将要覆盖区域的底色   px+m.x=100+m.x2-m.x1;=100+kx,相对位移同鼠标
//			getimage(m.x,m.y,&img3);
		putimage(m.x+px,m.y+py,&img2);
//			覆盖
		x=m.x+px;
		y=m.y+py;
		//			保存这次位置,成为下次的原位置,找到痕迹
		EndBatchDraw();
//			一次绘图出来,没有屏闪了
	} else if(flag==2)
		putpixel(m.x,m.y,RGB(255,155,4));
//			批量绘制,不会闪烁了
//			Sleep(1);

	switch(m.message) {

		case WM_LBUTTONDOWN:

			if(m.x>x&&m.x<x+200&&m.y>y&&m.y<y+200&&m.ctrl) {
				flag=1;
//					启动批复制粘贴
				getimage(&img2,x,y,200,200);
//					putimage(200, 200, &img1);
//					按动了就出现白块
				px=x-m.x;
				py=y-m.y;
//					记录鼠标和图片左上角的差值
			} else  {
				flag=2;

			}
			break;
		case WM_LBUTTONUP:
			flag=0;
			break;
	}
}
int main() {
	initgraph(640,640);
	setbkcolor(WHITE);
	cleardevice();
	setfillcolor(BLACK);
	setlinecolor(BLACK);

//	这是初始图片左上角位置,以后都是新图片左上角的位置

//	模的增量位移保存
	fillrectangle(100,100,300,300);
//	参考按钮


	while(1) {
		ExMessage m;
		m=getmessage(EX_MOUSE|EX_KEY);


		move(m);

	}
	closegraph();
	return 0;
}


这是第一代运行的版本,代码方面的别扭就是未来开发,移植函数的时候不好移植,因为画点的函数putpixel()也在这个拖动函数里。于是分离

分离之后的新版本

完整代码,对应序号10.bug分析......文件。主函数里用两个if和标志位实现原函数的功能分离。

#include<stdio.h>
#include<conio.h>
#include<graphics.h>

void draw(struct ExMessage m,int *flag1,int *qx,int *qy) {

	int x=*qx,y=*qy;

	int flag=*flag1;
	if(flag==2)
		putpixel(m.x,m.y,RGB(255,155,4));

	switch(m.message) {
		case WM_LBUTTONDOWN:
			if(m.x>x&&m.x<x+200&&m.y>y&&m.y<y+200&&m.ctrl) {

			} else  {
				flag=2;
			}
//			flag=2;
//			bug和移动函数问题
			break;
		case WM_LBUTTONUP:
			flag=0;
			break;
	}
	*flag1=flag;
}

void check(struct ExMessage m,int *flag1,int *qx,int*qy) {
	static	IMAGE img2;
//	getimage(&img2,100,100,200,200);
//	检测
	static	IMAGE img3;
	static	int x=*qx,y=*qy;
	static  int px=0,py=0;
	static int flag=*flag1;
	if(flag==1) {
		BeginBatchDraw();
		putimage(x,y,&img3);
//			在原位置恢复底层
		getimage(&img3,m.x+px,m.y+py,200,200);
//			获取原位置和将要覆盖区域的底色   px+m.x=100+m.x2-m.x1;=100+kx,相对位移同鼠标
//			getimage(m.x,m.y,&img3);
		putimage(m.x+px,m.y+py,&img2);
//			覆盖
		x=m.x+px;
		y=m.y+py;
		//			保存这次位置,成为下次的原位置,找到痕迹
		EndBatchDraw();
//			一次绘图出来,没有屏闪了
	}

	switch(m.message) {

		case WM_LBUTTONDOWN:
			if(m.x>x&&m.x<x+200&&m.y>y&&m.y<y+200&&m.ctrl) {
				flag=1;
//					启动批复制粘贴
				getimage(&img2,x,y,200,200);
//					putimage(200, 200, &img1);
//					按动了就出现白块
				px=x-m.x;
				py=y-m.y;
//					记录鼠标和图片左上角的差值
			}
			break;
		case WM_LBUTTONUP:
			flag=0;
			break;
	}
	*flag1=flag;
	*qx=x;
	*qy=y;
}

//
//
//void move(struct ExMessage m) {
//
//	static	IMAGE img2;
	getimage(&img2,100,100,200,200);
	检测
//	static	IMAGE img3;
//	static	int x=100,y=100;
//	static  int px=0,py=0;
//	static int flag=0;
//	if(flag==1) {
//		BeginBatchDraw();
//		putimage(x,y,&img3);
			在原位置恢复底层
//		getimage(&img3,m.x+px,m.y+py,200,200);
			获取原位置和将要覆盖区域的底色   px+m.x=100+m.x2-m.x1;=100+kx,相对位移同鼠标
			getimage(m.x,m.y,&img3);
//		putimage(m.x+px,m.y+py,&img2);
			覆盖
//		x=m.x+px;
//		y=m.y+py;
//		//			保存这次位置,成为下次的原位置,找到痕迹
//		EndBatchDraw();
			一次绘图出来,没有屏闪了
//	} else if(flag==2)
//		putpixel(m.x,m.y,RGB(255,155,4));
			批量绘制,不会闪烁了
			Sleep(1);
//
//	switch(m.message) {
//
//		case WM_LBUTTONDOWN:
//
//			if(m.x>x&&m.x<x+200&&m.y>y&&m.y<y+200&&m.ctrl) {
//				flag=1;
					启动批复制粘贴
//				getimage(&img2,x,y,200,200);
					putimage(200, 200, &img1);
					按动了就出现白块
//				px=x-m.x;
//				py=y-m.y;
					记录鼠标和图片左上角的差值
//			} else  {
//				flag=2;
//
//			}
//			break;
//		case WM_LBUTTONUP:
//			flag=0;
//			break;
//	}
//}
int main() {
	initgraph(640,640);
	setbkcolor(WHITE);
	cleardevice();
	setfillcolor(BLACK);
	setlinecolor(BLACK);

//	这是初始图片左上角位置,以后都是新图片左上角的位置

//	模的增量位移保存
	fillrectangle(100,100,300,300);
//	参考按钮
//	int qx=100;
//	int qy=100;
//	int flag=0;

	while(1) {
		ExMessage m;
		m=getmessage(EX_MOUSE|EX_KEY);

		static int qx=100;
		static int qy=100;
		static int flag=0;

		if(flag==0||flag==2)
			draw(m,&flag,&qx,&qy);
		if(flag==0||flag==1)
			check(m,&flag,&qx,&qy);
//		move(m);


	}
	closegraph();
	return 0;
}

 

 

 后来发现还有个bug,就是原来位置的贴图还在,这样拖动,原来的图片没有受到影响,相当于是复制粘贴了,所以还要想办法把原图清除掉。

后来想当然就想着在第一步移动之前覆盖图片,然后画白色矩形,但是想用原来的函数试试,相当于提前拖动一步。结果代码插入位置错误,甚至拖动也不能拖动,原因是间接使得控制变量共用,导致变量第一步死锁,后续不能修改变量。变量变成常数,失去了变化分类作用,就不能实现由不拖动到拖动的转换。

试了试几次,不得不人脑一行一行读check代码,发现一开始的旧图img3是空的。第一步img2读取黑色,第二步img3粘贴空的,第三步img3读取黑色作为下次粘贴,恢复原貌,第四步img2粘贴,完成一次拖动循环。

原来穷举清楚代码步骤就能自然而然地发现问题,黑色旧图没有消失,就是第三步img3读取的是黑色,旧地方应该放上白色,就是这四个阶段里插入一个只执行一次覆盖的代码。然后实际上是img2读取完黑色,图片就存起来了,原来地方的图片就可以不用了,就在img2执行完加上一块画矩形的代码,然后再增加参数,限制只使用一次,以后都不用了。

其实这说明实现拖动功能的函数控制变量的不安全性,函数结束,时,控制变量不一定复位。复位功能和其他参数绑定,导致其他参数没有作用时自己运行导致死锁。想办法增加一个检测if语句,如果有类似这种情况,就进行复位。

这就是矛盾中进步,无中生有bug,无中生有的复位。

后续可能新开发方向:多个悬浮图片。

当然后续发现拖动多个图片,由于函数内部暂存变量,导致多个图片共用同一个函数,变量一对多,导致记录对不上图片。想办法一个图片有自己独有的变量,就是一堆小弟。而这个群体的概念就是结构体,而这些参数可以再次包装,一个函数传入一个结构体,这个结构体包含被拖动图片的全部信息,这样就能实现多个图片拖动。图片的数据归结进各自的结构体。

这里没有封装结构体,因为封装了,面目全非,真正投入使用的成品代码可以详见EasyxDevC++开发地图编辑和游戏编辑代码工程文件附注释_哔哩哔哩_bilibili

本节最终完整代码:不带结构体封装的,原地图片被拖走的代码

效果图:

#include<stdio.h>
#include<conio.h>
#include<graphics.h>

void draw(struct ExMessage m,int *flag1,int *qx,int *qy) {

	int x=*qx,y=*qy;

	int flag=*flag1;
	if(flag==2)
		putpixel(m.x,m.y,RGB(255,155,4));

	switch(m.message) {
		case WM_LBUTTONDOWN:
			if(m.x>x&&m.x<x+200&&m.y>y&&m.y<y+200&&m.ctrl) {

			} else  {
				flag=2;
			}
//			flag=2;
//			bug和移动函数问题
			break;
		case WM_LBUTTONUP:
			flag=0;
			break;
	}
	*flag1=flag;
}

void check(struct ExMessage m,int *flag1,int *qx,int*qy) {
	static	IMAGE img2;
//	getimage(&img2,100,100,200,200);
//	检测
	static	IMAGE img3;
//	static  int one=1;
//	if(one==1) {
//		setfillcolor(WHITE);
//		fillrectangle(100-1,100-1,300,300);
//		one==0;
//	}
	static	int x=*qx,y=*qy;
	static  int px=0,py=0;
	static int flag=*flag1;
	if(flag==1) {
		BeginBatchDraw();
		putimage(x,y,&img3);
//			在原位置恢复底层
		getimage(&img3,m.x+px,m.y+py,200,200);
//			获取原位置和将要覆盖区域的底色   px+m.x=100+m.x2-m.x1;=100+kx,相对位移同鼠标
//			getimage(m.x,m.y,&img3);
		putimage(m.x+px,m.y+py,&img2);
//			覆盖
		x=m.x+px;
		y=m.y+py;
		//			保存这次位置,成为下次的原位置,找到痕迹
		EndBatchDraw();
//			一次绘图出来,没有屏闪了
	}

	switch(m.message) {

		case WM_LBUTTONDOWN:
			if(m.x>x&&m.x<x+200&&m.y>y&&m.y<y+200&&m.ctrl) {
				flag=1;
//					启动批复制粘贴
				getimage(&img2,x,y,200,200);
//					putimage(200, 200, &img1);
//					按动了就出现白块

//				静态变量只做一次,此后永不执行 
				static  int one=1;
				if(one==1) {
					setfillcolor(WHITE);
					fillrectangle(100-1,100-1,300,300);
					one==0;
				}
				
//				这里把之前的图片覆盖,当然由于矩形框的颜色没有设置成白色,于是留出来黑色的矩形框没有覆盖 
				
				px=x-m.x;
				py=y-m.y;
//					记录鼠标和图片左上角的差值
			}
			break;
		case WM_LBUTTONUP:
			flag=0;
			break;
	}
	*flag1=flag;
	*qx=x;
	*qy=y;
}

//
//
//void move(struct ExMessage m) {
//
//	static	IMAGE img2;
	getimage(&img2,100,100,200,200);
	检测
//	static	IMAGE img3;
//	static	int x=100,y=100;
//	static  int px=0,py=0;
//	static int flag=0;
//	if(flag==1) {
//		BeginBatchDraw();
//		putimage(x,y,&img3);
			在原位置恢复底层
//		getimage(&img3,m.x+px,m.y+py,200,200);
			获取原位置和将要覆盖区域的底色   px+m.x=100+m.x2-m.x1;=100+kx,相对位移同鼠标
			getimage(m.x,m.y,&img3);
//		putimage(m.x+px,m.y+py,&img2);
			覆盖
//		x=m.x+px;
//		y=m.y+py;
//		//			保存这次位置,成为下次的原位置,找到痕迹
//		EndBatchDraw();
			一次绘图出来,没有屏闪了
//	} else if(flag==2)
//		putpixel(m.x,m.y,RGB(255,155,4));
			批量绘制,不会闪烁了
			Sleep(1);
//
//	switch(m.message) {
//
//		case WM_LBUTTONDOWN:
//
//			if(m.x>x&&m.x<x+200&&m.y>y&&m.y<y+200&&m.ctrl) {
//				flag=1;
					启动批复制粘贴
//				getimage(&img2,x,y,200,200);
					putimage(200, 200, &img1);
					按动了就出现白块
//				px=x-m.x;
//				py=y-m.y;
					记录鼠标和图片左上角的差值
//			} else  {
//				flag=2;
//
//			}
//			break;
//		case WM_LBUTTONUP:
//			flag=0;
//			break;
//	}
//}
int main() {
	initgraph(640,640);
	setbkcolor(WHITE);
	cleardevice();
	setfillcolor(BLACK);
	setlinecolor(BLACK);

//	这是初始图片左上角位置,以后都是新图片左上角的位置

//	模的增量位移保存



	fillrectangle(100,100,300,300);
//	参考按钮
//	int qx=100;
//	int qy=100;
//	int flag=0;

	while(1) {
		ExMessage m;
		m=getmessage(EX_MOUSE|EX_KEY);

		static int qx=100;
		static int qy=100;
		static int flag=0;

		if(flag==0||flag==2)
			draw(m,&flag,&qx,&qy);
		if(flag==0||flag==1)
			check(m,&flag,&qx,&qy);
//		move(m);


	}
	closegraph();
	return 0;
}

 附带:用.h头文件封装后的完整代码,复制粘贴引用才能跑

.h完整代码如下:

封装结构体:

orilx,orily分别是初始位置左上角位置坐标

a,h分别是图片长度,高度

m1x,m1y分别是上一次粘贴图片的位置左上角坐标

drawflag就是之前的控制从不拖动转换为拖动的转换变量

img2是

struct pircle {
	IMAGE img2;
	IMAGE img3;
	int orilx,orily;
	int nowlx,nowly;
	int a,h;
//	原有图片的左上角坐标
	int m1x=0,m1y=0;
	int  putflag=0;
	int  drawflag=0;
	struct skline b;
} save;


 结构体参数下的拖动函数样子,函数顺序有所调整:


void movecheck(struct ExMessage m,struct pircle *save) {

	if(save->putflag==0&&m.message==WM_LBUTTONDOWN) 
	{
		if(save->m1x==0&&save->m1y==0&&m.x>save->orilx&&m.x<save->orilx+save->a&&m.y>save->orily&&m.y<save->orily+save->h) {
			getimage(&save->img2,save->orilx,save->orily,save->a,save->h);
			getimage(&save->img3,save->orilx,save->orily,save->a,save->h);
			save->m1x=m.x;
			save->m1y=m.y;
			save->putflag=true;
			printf("2222\n");
		} else if(m.x>save->nowlx&&m.x<save->nowlx+save->a&&m.y>save->nowly&&m.y<save->nowly+save->h) {
			save->putflag=true;
			getimage(&save->img2,save->orilx,save->orily,save->a,save->h);

			save->m1x=m.x;
			save->m1y=m.y;
//			printf("11111\n");
		}
	} else if(save->putflag==true) {
		BeginBatchDraw();

		putimage(save->nowlx,save->nowly,&save->img3);
		save->nowlx=save->nowlx+m.x-save->m1x;
		save->nowly=save->nowly+m.y-save->m1y;
		save->m1x=m.x;
		save->m1y=m.y;
		getimage(&save->img3,save->nowlx,save->nowly,save->a,save->h);
		putimage(save->nowlx,save->nowly,&save->img2);

		EndBatchDraw();

		if(m.message==WM_LBUTTONUP) {
			save->putflag=0;
		}
//			一次绘图出来,没有屏闪了
	}
	

		putimage(save->nowlx,save->nowly,&save->img2);
	

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/265297.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码审查工具FishEye详细使用教程

1. Git代码仓库设置 1、登录并进入到FishEye主页面&#xff0c;点击Repositories进入仓库管理页面&#xff0c;如下图&#xff1a; 2、填写仓库信息&#xff0c;如下图&#xff1a; 3、填写Git地址 http://gitAccount:gitPwd118.24.231.166:8080/git/git/iot-lvdao/iot-dhcc.…

【小黑嵌入式系统第十二课】μC/OS-III程序设计基础(二)——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量

上一课&#xff1a; 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础&#xff08;一&#xff09;——任务设计、任务管理&#xff08;创建&基本状态&内部任务&#xff09;、任务调度、系统函数 文章目录 一、系统函数使用场合1.1 时间管理1.1.1 控制任务的执行周期1…

自动生成数控加工的轨迹刀具轨迹阿基米德螺旋线(3D)

文章目录 1. 阿基米德螺旋线2. 生成步骤目标: 基于点云自动生成阿基米德螺旋线轨迹点 针对的是半球形模型效果 1. 阿基米德螺旋线 阿基米德螺旋线(Archimedean spiral)是一种数学曲线,由古希腊数学家阿基米德(Archimedes)在公元前225年左右首次研究和描述。这条曲线的方…

如何实现酷狗音乐pc页面点击播放时,打开多个歌曲播放时,始终在一个播放页面,(标签页的通讯)

大致有两种思路&#xff0c; 一种是通过wind.open()方法传第二个参数&#xff0c; A页面&#xff1a; //点击跳转播放页函数function toPlayPage(){window.open(path/xxxx/xxxx?name音乐名,music)//第二个参数写一个定值&#xff0c;代表跳转页面都为music标签页&#xff0…

计算机服务器中了halo勒索病毒如何解密,halo勒索病毒解密数据恢复

计算机技术的不断发展&#xff0c;为企业的生产运营提供了极大便利&#xff0c;但也为网络安全埋下隐患&#xff0c;网络上的勒索病毒种类也在不断增加&#xff0c;给企业的数据安全带来了严重威胁。近日&#xff0c;云天数据恢复中心接到许多企业的求助&#xff0c;企业的计算…

Unity3D移动端实现摇一摇功能

手机摇一摇功能在平时项目开发中是很常见的需求&#xff0c;利用Unity的重力感应可以很方便的实现该功能。 Unity简化了重力感应的开发&#xff0c; 通过访问Input.acceleration属性&#xff0c;取回加速度传感器的值。首先我们看一下重力传感器的方向问题。Unity3D中重量的取…

【内存泄漏】内存泄漏及常见的内存泄漏检测工具介绍

内存泄漏介绍 什么是内存泄漏 内存泄漏是指程序分配了一块内存&#xff08;通常是动态分配的堆内存&#xff09;&#xff0c;但在不再需要这块内存的情况下未将其释放。内存泄漏会导致程序浪费系统内存资源&#xff0c;持续的内存泄漏还导致系统内存的逐渐耗尽&#xff0c;最…

【Linux】进程周边007之进程控制

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.进程创建 2.进程终止 2.…

python调用DALL·E绘画

实现用gpt的api和他对话后&#xff0c;我们试着调用DALLE的api进行绘画 参考文档 OpenAI API 运行代码 from openai import OpenAIclient OpenAI()user_prompt input("请输入您想生成的图片描述: ")response client.images.generate(model"dall-e-3"…

SpringIOC之SimpleTimeZoneAwareLocaleContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

CSS新手入门笔记整理:CSS3弹性盒模型

特点 子元素宽度之和小于父元素宽度&#xff0c;所有子元素最终的宽度就是原来定义的宽度。子元素宽度之和大于父元素宽度&#xff0c;子元素会按比例来划分宽度。在使用弹性盒子模型之前&#xff0c;必须为父元素定义“display:flex;”或“display:inline-flex;”。 弹性盒子…

Linux笔记本电脑投屏到电视,用网页浏览器就能投屏到电视!

Linux系统的电脑如果要投屏到安卓电视屏幕上&#xff0c;可以使用投屏工具AirDroid Cast的网页版和TV版一起实现。 首先&#xff0c;在Linux系统的电脑里用chrome浏览器或edge浏览器打开网址webcast.airdroid.com。这个网址就是AirDroid Cast的网页版。你可以看到中间白色框框的…

一文搞懂 java8 reduce操作

什么是 reduce Java8 中有两大最为重要的改变&#xff0c;其一是 Lambda 表达式&#xff0c;另一个就是 Stream API 了。 Stream 是 Java8 中处理集合的关键抽象概念&#xff0c;它将数据源流化后&#xff0c;可以执行非常复杂的查找、过滤和映射数据、排序、切片、聚合统计等…

中国化妆品头部企业环亚集团携美肤宝、法兰琳卡、滋源、肌肤未来等“新朋友”加入实在智能数智生态圈

广州环亚化妆品科技股份有限公司&#xff08;以下简称“环亚集团”&#xff09;是一家综合性美容化妆品高新技术企业&#xff0c;旗下拥有美肤宝、法兰琳卡、滋源、肌肤未来等多个品牌&#xff0c;产品涵盖洁肤护肤、洗护发、身体护理、精油等多个领域。在中国、澳大利亚、美国…

27 redis 的 sentinel 集群

前言 redis 的哨兵的相关业务功能的实现 哨兵的主要作用是 检测 redis 主从集群中的 master 是否挂掉, 单个哨兵节点识别 master 下线为主管下线, 超过 quorum 个 哨兵节点 认为 master 挂掉, 识别为 客观下线 然后做 failover 的相关处理, 重新选举 master 节点 我们这里…

【C++刷题】前缀和

【C刷题】前缀和 一、前缀和1、题目链接2、解析3、代码 二、二位前缀和1、题目链接2、解析3、代码 三、寻找数组的中心下标1、题目链接2、解析3、代码 四、除自身以外数组的乘积1、题目链接2、解析3、代码 五、和为K的子数组1、题目链接2、解析3、代码 六、和可被K整除的子数组…

Linux Shell 001-Bash简介

Linux Shell 001-Bash简介 本节关键字&#xff1a;Linux、Bash Shell、shell分类 相关指令&#xff1a;bash、sh、cat Shell的介绍 计算机只能认识&#xff08;识别&#xff09;机器语言(0和1)&#xff0c;如&#xff08;11000000 这种&#xff09;。但是&#xff0c;我们的…

手写MapReduce实现WordCount

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 需求分析编写MapReduce实现上述功能Mapper类Reducer类Driver类 查看输出结果 需求 假设有一个文本文件word.txt&#xff0c;我们想要统计这个文本文件中每个单词出现的次数。 文件内容如下…

【内存泄露】记一次内存泄露排查,罪魁祸首是HttpClient

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 很久很久以前,曾经的青葱…

docker构建镜像及项目部署

文章目录 练习资料下载一、docker基础1. 基本概念2. docker常见命令3. 命令别名4. 数据卷 二、docker自定义镜像1. 了解镜像结构2. 了解Dockerfile3. 构建Dockerfile文件&#xff0c;完成自定义镜像 三、网络1. docker常见网络命令2. docker自带虚拟网络3. 自定义网络 四、dock…