20.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据分析工具数据类型编辑功能的实现

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于: 易道云信息技术研究院VIP课

上一个内容:19.数据分析工具数据类型配置功能的实现

码云地址(master 分支):https://gitee.com/dye_your_fingers/titan

码云版本号:037b8a13a9b2a1b635fe2beddc7c2c1ac7abd602

代码下载地址,在 titan 目录下,文件名为:titan-数据分析工具数据类型编辑功能的实现.zip

链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg

提取码:q9n5

--来自百度网盘超级会员V4的分享

HOOK引擎,文件名为:黑兔sdk升级版.zip

链接:https://pan.baidu.com/s/1IB-Zs6hi3yU8LC2f-8hIEw

提取码:78h8

--来自百度网盘超级会员V4的分享

以 19.数据分析工具数据类型配置功能的实现 它的代码为基础进行修改

上一个内容里把输出到列表显示复选框,搞成了控件类型,这里要进行更改,下图是我改好之后的截图,

修改的代码位置:

数据设置里的菜单添加处理事件

修改:

删除:

CSet.cpp文件的修改:修改了 OnNMRClickList2函数、OnAddMsgType函数、OnSetMsg函数,新加 IsExitMsg函数、IsExitData函数、OnSetDataType函数、OnDelData函数、nDataSel变量

// CSet.cpp: 实现文件
//#include "pch.h"
#include "DataAnly.h"
#include "CSet.h"
#include "afxdialogex.h"
#include "extern_all.h"// CSet 对话框IMPLEMENT_DYNAMIC(CSet, CDialogEx)CSet::CSet(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_SET, pParent)
{}CSet::~CSet()
{
}void CSet::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST1, lstMsgType);DDX_Control(pDX, IDC_LIST2, lstDataType);
}BOOL CSet::OnInitDialog()
{CDialogEx::OnInitDialog();SetListView(&lstMsgType);SetListView(&lstDataType);lstMsgType.InsertColumn(0, L"名称", 0, 100);lstMsgType.InsertColumn(1, L"宏定义", 0, 100);lstMsgType.InsertColumn(2, L"类型", 0, 100); // 数据和文本,文本直接显示,数据有点复杂看之后实现位置lstMsgType.InsertColumn(3, L"输出到文件", 0, 100);lstDataType.InsertColumn(0, L"消息类型", 0, 100);lstDataType.InsertColumn(1, L"编号", 0, 100);lstDataType.InsertColumn(2, L"名称", 0, 100);lstDataType.InsertColumn(3, L"背景颜色", 0, 100);lstDataType.InsertColumn(4, L"字体颜色", 0, 100);lstDataType.InsertColumn(5, L"显示", 0, 100);lstDataType.InsertColumn(6, L"输出", 0, 100);lstDataType.InsertColumn(7, L"单独输出", 0, 100);return TRUE;
}BEGIN_MESSAGE_MAP(CSet, CDialogEx)ON_BN_CLICKED(IDOK, &CSet::OnBnClickedOk)ON_BN_CLICKED(IDCANCEL, &CSet::OnBnClickedCancel)ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CSet::OnNMRClickList1)ON_NOTIFY(NM_RCLICK, IDC_LIST2, &CSet::OnNMRClickList2)ON_COMMAND(ID_32771, &CSet::OnAddMsgType)ON_COMMAND(ID_32772, &CSet::OnSetMsg)ON_COMMAND(ID_32773, &CSet::OnDelMsg)ON_COMMAND(ID_32777, &CSet::OnAddDataType)ON_COMMAND(ID_32775, &CSet::OnSetDataType)ON_COMMAND(ID_32776, &CSet::OnDelData)
END_MESSAGE_MAP()// CSet 消息处理程序void CSet::OnBnClickedOk()
{// TODO: 在此添加控件通知处理程序代码CDialogEx::OnOK();
}void CSet::OnBnClickedCancel()
{// TODO: 在此添加控件通知处理程序代码CDialogEx::OnCancel();
}void CSet::OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{LPNMITEMACTIVATE p = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知处理程序代码*pResult = 0;nMsgSel = p->iItem;/*GetMessagePos函数可以,获取光标位置返回值低16位是x,高16位是y*/DWORD dwPos = GetMessagePos();CPoint point(LOWORD(dwPos), HIWORD(dwPos));CMenu menu;menu.LoadMenuW(IDR_MENU1);// 根据菜单窗口id获取一个菜单窗口对象CMenu* pop = menu.GetSubMenu(0);// 获取第一个菜单,也就是现在的消息设置这个菜单// 在指定位置显示浮动弹出菜单,并跟踪弹出菜单上项的选择情况。pop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);
}void CSet::OnNMRClickList2(NMHDR* pNMHDR, LRESULT* pResult)
{LPNMITEMACTIVATE p = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知处理程序代码*pResult = 0;nDataSel = p->iItem;/*GetMessagePos函数可以,获取光标位置返回值低16位是x,高16位是y
*/DWORD dwPos = GetMessagePos();CPoint point(LOWORD(dwPos), HIWORD(dwPos));CMenu menu;menu.LoadMenuW(IDR_MENU1);// 根据菜单窗口id获取一个菜单窗口对象CMenu* pop = menu.GetSubMenu(1);// 获取第一个菜单,也就是现在的消息设置这个菜单// 在指定位置显示浮动弹出菜单,并跟踪弹出菜单上项的选择情况。pop->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}void CSet::OnAddMsgType()
{if (wndMsgSet.DoModal() == IDOK) {int icount = lstMsgType.GetItemCount();for (int i = 0; i < icount; i++){if (lstMsgType.GetItemText(i, 0) == wndMsgSet.txtName) {AfxMessageBox(L"消息名已存在!");return;}if (lstMsgType.GetItemText(i, 1) == wndMsgSet.txtDefine) {AfxMessageBox(L"宏定义已存在!");return;}}lstMsgType.InsertItem(icount, wndMsgSet.txtName);lstMsgType.SetItemText(icount, 1, wndMsgSet.txtDefine);lstMsgType.SetItemText(icount, 2, wndMsgSet.txtTypeName);lstMsgType.SetItemText(icount, 3, txtBool[wndMsgSet.IsTxt]);}
}void CSet::OnSetMsg()
{if (nMsgSel > -1) {wndMsgSet.SetDatas(lstMsgType.GetItemText(nMsgSel, 0), lstMsgType.GetItemText(nMsgSel, 1), lstMsgType.GetItemText(nMsgSel, 2), lstMsgType.GetItemText(nMsgSel, 3)==L"是");if (wndMsgSet.DoModal() == IDOK) {int icount = lstMsgType.GetItemCount();for (int i = 0; i < icount; i++){if (lstMsgType.GetItemText(i, 0) == wndMsgSet.txtName) {if (i != nMsgSel) {AfxMessageBox(L"消息名已存在!");return;}}if (lstMsgType.GetItemText(i, 1) == wndMsgSet.txtDefine) {if (i != nMsgSel) {AfxMessageBox(L"宏定义已存在!");return;}}}lstMsgType.SetItemText(nMsgSel, 0, wndMsgSet.txtName);lstMsgType.SetItemText(nMsgSel, 1, wndMsgSet.txtDefine);lstMsgType.SetItemText(nMsgSel, 2, wndMsgSet.txtTypeName);lstMsgType.SetItemText(nMsgSel, 3, txtBool[wndMsgSet.IsTxt]);}}
}void CSet::OnDelMsg()
{if (nMsgSel > -1) {lstMsgType.DeleteItem(nMsgSel);}
}void CSet::OnAddDataType()
{if (nMsgSel > -1) {// 给消息数据窗口里消息名称输入框赋值wndDataSet.txtName = lstMsgType.GetItemText(nMsgSel, 0);if (wndDataSet.DoModal() == IDOK) {if (!IsExitMsg(wndDataSet.txtName)) {AfxMessageBox(L"消息不存在,可能已经被删除!");return;}if (IsExitData(wndDataSet.txtName, wndDataSet.txtId)) {AfxMessageBox(L"消息对应的数据编号已经存在!");return;}int icount = lstDataType.GetItemCount();lstDataType.InsertItem(icount, wndDataSet.txtName);lstDataType.SetItemText(icount,1, wndDataSet.txtId);lstDataType.SetItemText(icount,2, wndDataSet.txtDataName);lstDataType.SetItemText(icount,3, wndDataSet.txtBackColor);lstDataType.SetItemText(icount,4, wndDataSet.txtFontColor);lstDataType.SetItemText(icount,5, txtBool[wndDataSet.IsShowUI]);lstDataType.SetItemText(icount,6, txtBool[wndDataSet.IsTxt]);lstDataType.SetItemText(icount,7, txtBool[wndDataSet.IsTxtAlone]);}}
}void CSet::OnSetDataType()
{if (nDataSel > -1) {wndDataSet.txtName = lstDataType.GetItemText(nDataSel, 0),wndDataSet.txtId = lstDataType.GetItemText(nDataSel, 1),wndDataSet.txtDataName = lstDataType.GetItemText(nDataSel, 2),wndDataSet.txtBackColor = lstDataType.GetItemText(nDataSel, 3),wndDataSet.txtFontColor = lstDataType.GetItemText(nDataSel, 4),wndDataSet.IsShowUI = lstDataType.GetItemText(nDataSel, 5) == L"是";wndDataSet.IsTxt = lstDataType.GetItemText(nDataSel, 6) == L"是";wndDataSet.IsTxtAlone = lstDataType.GetItemText(nDataSel, 7) == L"是";if (wndDataSet.DoModal() == IDOK) {int icount = nDataSel;if (!IsExitMsg(wndDataSet.txtName)) {AfxMessageBox(L"消息不存在,可能已经被删除!");lstDataType.DeleteItem(nDataSel);return;}if (IsExitData(wndDataSet.txtName, wndDataSet.txtId, icount)) {AfxMessageBox(L"消息对应的数据编号已经存在!");return;}lstDataType.SetItemText(icount, 0, wndDataSet.txtName);lstDataType.SetItemText(icount, 1, wndDataSet.txtId);lstDataType.SetItemText(icount, 2, wndDataSet.txtDataName);lstDataType.SetItemText(icount, 3, wndDataSet.txtBackColor);lstDataType.SetItemText(icount, 4, wndDataSet.txtFontColor);lstDataType.SetItemText(icount, 5, txtBool[wndDataSet.IsShowUI]);lstDataType.SetItemText(icount, 6, txtBool[wndDataSet.IsTxt]);lstDataType.SetItemText(icount, 7, txtBool[wndDataSet.IsTxtAlone]);}}
}void CSet::OnDelData()
{if (nDataSel > -1) {lstDataType.DeleteItem(nDataSel);}
}bool CSet::IsExitMsg(CString& _name)
{for (int i = 0; i < lstMsgType.GetItemCount(); i++){if (lstMsgType.GetItemText(i, 0) == _name) {return true;}}return false;
}bool CSet::IsExitData(CString& _name, CString& _id)
{for (int i = 0; i < lstDataType.GetItemCount(); i++){if ((lstDataType.GetItemText(i, 0) == _name)&&(lstDataType.GetItemText(i, 1) == _id)) {return true;}}return false;
}bool CSet::IsExitData(CString& _name, CString& _id, int index)
{for (int i = 0; i < lstDataType.GetItemCount(); i++){if ((lstDataType.GetItemText(i, 0) == _name) && (lstDataType.GetItemText(i, 1) == _id)&&(index != i)) {return true;}}return false;
}

CSet.h文件的修改:新加 IsExitMsg函数、IsExitData函数、OnSetDataType函数、OnDelData函数、nDataSel变量

#pragma once
#include "CSetMsg.h"
#include "CSetData.h"// CSet 对话框class CSet : public CDialogEx
{DECLARE_DYNAMIC(CSet)public:CSet(CWnd* pParent = nullptr);   // 标准构造函数virtual ~CSet();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_SET };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持	// 生成的消息映射函数virtual BOOL OnInitDialog();DECLARE_MESSAGE_MAP()
public:CListCtrl lstMsgType;CListCtrl lstDataType;afx_msg void OnBnClickedOk();afx_msg void OnBnClickedCancel();afx_msg void OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnNMRClickList2(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnAddMsgType();
public:CSetMsg wndMsgSet;CSetData wndDataSet;CString txtBool[2]{ L"否", L"是" };int nMsgSel; // 消息定义列表选中行索引int nDataSel; // 数据定义列表选中行索引afx_msg void OnSetMsg(); // lstMsgType 添加数据afx_msg void OnDelMsg(); // lstMsgType 列表数据删除afx_msg void OnAddDataType(); // 选中 lstMsgType 列表里的一个数据,根据这个数据添加一个 lstDataType列表数据afx_msg void OnSetDataType(); // lstDataType 列表数据修改afx_msg void OnDelData(); // lstDataType 列表数据删除// 判断 lstMsgType 列表是否有重复的bool IsExitMsg(CString& _name);// 判断 lstDataType 列表里的内容是否有重复的bool IsExitData(CString& _name, CString& _id);// 判断 lstDataType 列表里的内容是否有重复的 修改里要排除自身所以才有的这个函数bool IsExitData(CString& _name, CString& _id, int index);
};

CSetData.h文件的修改:修改 IsShowUI变量类型

#pragma once// CSetData 对话框class CSetData : public CDialogEx
{DECLARE_DYNAMIC(CSetData)public:CSetData(CWnd* pParent = nullptr);   // 标准构造函数virtual ~CSetData();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_SETDATA };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持DECLARE_MESSAGE_MAP()
public:CString txtName;CString txtId;CString txtDataName;CString txtBackColor;CString txtFontColor;BOOL IsTxt;BOOL IsTxtAlone;BOOL IsShowUI;afx_msg void OnBnClickedButton1();afx_msg void OnBnClickedButton6();afx_msg void OnBnClickedOk();
};

CSetData.cpp文件的修改:修改了 DoDataExchange函数、CSetData函数

// CSetData.cpp: 实现文件
//#include "pch.h"
#include "DataAnly.h"
#include "CSetData.h"
#include "afxdialogex.h"// CSetData 对话框IMPLEMENT_DYNAMIC(CSetData, CDialogEx)CSetData::CSetData(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_SETDATA, pParent), txtName(_T("")), txtId(_T("0"))// 设置数据编号输入框默认值, txtDataName(_T("无")) // 设置数据名字输入框默认值, txtBackColor(_T("FFFFFF"))  // 设置背景颜色默认值为白色, txtFontColor(_T("0")) // 设置文字颜色默认值为黑色, IsTxt(FALSE), IsTxtAlone(FALSE), IsShowUI(FALSE)
{}CSetData::~CSetData()
{
}void CSetData::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT3, txtName);DDX_Text(pDX, IDC_EDIT1, txtId);DDX_Text(pDX, IDC_EDIT2, txtDataName);DDX_Text(pDX, IDC_EDIT5, txtBackColor);DDX_Text(pDX, IDC_EDIT6, txtFontColor);DDX_Check(pDX, IDC_CHECK1, IsTxt);DDX_Check(pDX, IDC_CHECK2, IsTxtAlone);DDX_Check(pDX, IDC_CHECK3, IsShowUI);
}BEGIN_MESSAGE_MAP(CSetData, CDialogEx)ON_BN_CLICKED(IDC_BUTTON1, &CSetData::OnBnClickedButton1)ON_BN_CLICKED(IDC_BUTTON6, &CSetData::OnBnClickedButton6)ON_BN_CLICKED(IDOK, &CSetData::OnBnClickedOk)
END_MESSAGE_MAP()// CSetData 消息处理程序void CSetData::OnBnClickedButton1()
{/*颜色选择Dialog对象*/CColorDialog color;color.m_cc.Flags |= CC_RGBINIT;/*color.DoModal() 打开一个颜色选择对话框*/if (color.DoModal() == IDOK) {txtBackColor.Format(L"%X", color.m_cc.rgbResult);UpdateData(false);}
}void CSetData::OnBnClickedButton6()
{/*颜色选择Dialog对象
*/CColorDialog color;color.m_cc.Flags |= CC_RGBINIT;/*color.DoModal() 打开一个颜色选择对话框*/if (color.DoModal() == IDOK) {txtFontColor.Format(L"%X", color.m_cc.rgbResult);UpdateData(false);}
}void CSetData::OnBnClickedOk()
{UpdateData(TRUE);CDialogEx::OnOK();
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity学习(49)——服务器三次注册限制以及数据库化角色信息4--角色信息数据库化

1.此处下断开始调试,list函数内就有问题&#xff1a; 2. 现在的问题是只读不写&#xff01;32行就是写入部分的代码&#xff1a; 3. 很奇怪&#xff0c;调试的时候确实是写进来了 程序正常执行后&#xff0c;文件中数据也没有消失 关闭服务器文件内容依旧正常。 players包含所…

MySQL篇—执行计划之覆盖索引Using index和条件过滤Using where介绍(第三篇,总共三篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

提醒一下!今年考研的人不要太老实了!!

今年准备计算机考研的同学&#xff0c;别太老实了&#xff01;别人说什么你就信什么 如果你的工作能力不足以支撑找到一个满意的工作&#xff0c;那我建议再沉淀两年&#xff01; 很多同学其实有点眼高手低&#xff0c;在计算机专业&#xff0c;低于1w的工作看不上&#xff0…

操作系统引导

目录 一. 什么是操作系统引导 \quad 一. 什么是操作系统引导 \quad 什么是操作系统引导: 就是在开机的时候, 怎么让操作系统运行起来 操作系统是安装在C盘的 分区表用来说明C,D,E,F盘的存储空间 RAM一关机, 里面的数据就会被清空, ROM则不会 MBR里面的程序被读到RAM里面, 那…

qt自定义时间选择控件窗口

效果如图&#xff1a; 布局如图&#xff1a; 参考代码&#xff1a; //DateTimeSelectWidget #ifndef DATETIMESELECTWIDGET_H #define DATETIMESELECTWIDGET_H#include <QWidget> #include <QDateTime>namespace Ui { class DateTimeSelectWidget; }class DateTim…

单链表OJ题:LeetCode--141.环形链表

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下LeetCode中的第141道单链表OJ题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 …

O2O:Sample Efficient Offline-to-Online Reinforcement Learning

IEEE TKDE 2024 paper Introduction O2O存在策略探索受限以及分布偏移问题&#xff0c;进而导致在线微调阶段样本效率低。文章提出OEMA算法首先使用离线数据训练乐观的探索策略&#xff0c;然后提出基于元学习的优化方法&#xff0c;减少分布偏移并提高O2O的适应过程。 Meth…

OpenHarmony教程指南-自定义通知推送

介绍 本示例主要展示了通知过滤回调管理的功能&#xff0c;使用ohos.notificationManager 接口&#xff0c;进行通知监听回调&#xff0c;决定应用通知是否发送。 效果预览 使用说明 1.在使用本应用时&#xff0c;需安装自定义通知角标应用&#xff1b; 2.在主界面&#xff…

重学SpringBoot3-WebMvcAutoConfiguration类

重学SpringBoot3-WebMvcAutoConfiguration类 是什么什么用生效条件作用 自定义配置的三种方式自定义配置举例1. 自定义 DispatcherServlet 配置2. 静态资源配置3. 自定义MVC配置4. 消息转换器5. 异常处理 是什么 org.springframework.boot.autoconfigure.web.servlet.WebMvcAut…

FPGA IBUFG

IBUFG和IBUFGDS的输入端仅仅与芯片的专用全局时钟输入管脚有物理连接&#xff0c;与普通IO和其它内部CLB等没有物理连接。 所以&#xff0c;IBUFG输入的不能直接接另外信号。 GTH transceiver primitives are called GTHE3_COMMON and GTHE3_CHANNEL in UltraScale FPGAs, an…

@RequestMapping与@GetMapping和@PostMapping等注解的区别

目录 前置知识 大致区别 使用场景上的注意事项 如何工作 使用案例 写法对比 前置知识 HTTP请求方法一共有9种&#xff0c;为&#xff1a;GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECTGET(获取资源) 本质就是发送一个请求来取得服务器上的某一资源&…

【Java代码审计】JNDI+RMI绕过高版本JDK的限制

【Java代码审计】JNDIRMI绕过高版本JDK的限制 1.高版本JDK利用注入导致的问题2.绕过分析3.Tomcat8绕过4.工具绕过 1.高版本JDK利用注入导致的问题 JDK 6u132、7u122、8u113 开始 com.sun.jndi.rmi.object.trustURLCodebase 默认值为false&#xff0c;运行时需加入参数 -Dcom.s…

Go语言物联网开发安科瑞ADW300/4G电能表数据上传mqtt平台-电表接线到传输数据完整流程

电能表功能说明 ADW300是方便用户进行用电监测、集抄和管理&#xff0c;可灵活安装在配电箱中&#xff0c;可用于电力运维、环保监管等在线监测类平台中。我们本案例是用于工业售电公司对出售电的管理&#xff0c;设备可以监控用电情况、故障监控及警报&#xff0c;售电公司可…

(完美方案)解决mfc140u.dll文件丢失问题,快速且有效的修复

唉&#xff0c;又是丢失了mfc140u.dll&#xff0c;这该怎么办呢&#xff1f;如果你的电脑突然找不到或丢失mfc140u.dll文件&#xff0c;那就真是太糟糕了。别担心&#xff0c;我分享给你一些干货&#xff0c;告诉你如何快速解决mfc140u.dll丢失的问题。 一.mfc140u.dll属性功能…

百度地图城市点位数据下载并转换

概述 在浏览百度地图开放平台的时候&#xff0c;发现有个资源下载页面&#xff0c;里面有个城市中心点位和百度地图行政区划adcode映射表数据&#xff0c;这是一个经常使用到的数据&#xff0c;本文实现将这个数据转换为geojson&#xff0c;并借助QGIS转换为经纬度坐标或火星坐…

LCR 175. 计算二叉树的深度

一、题目描述 LCR 175. 计算二叉树的深度 二、思路 递归求左右子树的高度 三、解题思路 把大规模的问题拆分成小规模的问题1、要求根节点的二叉树深度 2、转换子问题&#xff1a;求左子树为根节点的二叉树深度 3、转换子问题&#xff1a;成求右子树为根节点的二叉树深度 4、最…

宏auto关键字(C++基础)

宏 宏可以实现对语句的同义替换&#xff0c;简单来说就是预处理阶段、编译前的替换&#xff08;包括符号&#xff0c;变量等&#xff09;。 #define LOG(x) std::cout << x << std::endl; LOG("hello") 可以正常使用。 下面通过上图中借用不同开发模…

Threejs着色器(GPU)编程——感温管网

管网,作为支撑现代城市运转的重要基础设施,是隐藏在地面之下的庞大工程网络。这些管网如同城市的血脉,负责输送各种必要的资源,如水源、热力、燃气等,同时排除废水和其他废弃物。然而,由于其位于地下,人们往往难以直接感知其存在和运行状态。为了保障这些地下管网的安全…

Leetcode - 周赛387

目录 一&#xff0c;3069. 将元素分配到两个数组中 I 二&#xff0c;3070. 元素和小于等于 k 的子矩阵的数目 三&#xff0c;3071. 在矩阵上写出字母 Y 所需的最少操作次数 四&#xff0c;3072. 将元素分配到两个数组中 II 一&#xff0c;3069. 将元素分配到两个数组中 I 本…

Express学习(三)

Express中间件 中间件的概念 什么是中间件 中间件&#xff0c;特指业务流程的中间处理环节。Express中间件的调用流程 当一个请求到达Express的服务器之后&#xff0c;可以连续调用多个中间件&#xff0c;从而对这次请求进行预处理。类似于下图所示 Express中间件的格式 Expr…