当前位置: 首页 > news >正文

深入理解指针与回调函数:从基础到实践

引言

在C语言中,指针和回调函数是两个非常重要的概念。指针为我们提供了直接操作内存的能力,而回调函数则为我们提供了一种灵活的编程方式,使得我们可以将函数作为参数传递给其他函数,从而实现更加模块化和可复用的代码。本文将深入探讨指针和回调函数的概念,并通过实际的代码示例来展示它们的应用。

1. 回调函数是什么?


1.1 回调函数的定义


回调函数(Callback Function)是一种通过函数指针调用的函数。简单来说,回调函数是一个在特定事件或条件发生时被调用的函数。回调函数不是由该函数的实现方直接调用,而是通过函数指针传递给另一个函数,由该函数在适当的时机调用。

1.2 回调函数的作用


回调函数的主要作用是解耦代码。通过将函数作为参数传递,我们可以将代码的逻辑分离,使得代码更加模块化和可复用。例如,在一个计算器程序中,我们可以将加法、减法、乘法、除法等操作封装成不同的函数,然后通过回调函数的方式将这些函数传递给一个统一的处理函数,从而避免重复的代码。

1.3 回调函数的示例


让我们通过一个简单的例子来理解回调函数的使用。假设我们有一个计算器程序,用户可以选择不同的操作(加法、减法、乘法、除法),程序会根据用户的选择执行相应的操作。

1.3.1 使用回调函数改造前
#include <stdio.h>int add(int a, int b) {return a + b;
}int sub(int a, int b) {return a - b;
}int mul(int a, int b) {return a * b;
}int div(int a, int b) {return a / b;
}int main() {int x, y;int input = 1;int ret = 0;do {printf("**********\n");printf(" 1:add \n");printf(" 2:sub \n");printf(" 3:mul \n");printf(" 4:div \n");printf(" 0:exit \n");printf("**********\n");printf("请选择:");scanf("%d", &input);switch (input) {case 1:printf("输入操作数:");scanf("%d %d", &x, &y);ret = add(x, y);printf("ret = %d\n", ret);break;case 2:printf("输入操作数:");scanf("%d %d", &x, &y);ret = sub(x, y);printf("ret = %d\n", ret);break;case 3:printf("输入操作数:");scanf("%d %d", &x, &y);ret = mul(x, y);printf("ret = %d\n", ret);break;case 4:printf("输入操作数:");scanf("%d %d", &x, &y);ret = div(x, y);printf("ret = %d\n", ret);break;case 0:printf("退出程序\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}



在这个代码中,我们使用了switch语句来根据用户的选择调用不同的函数。虽然这个代码可以正常工作,但是它存在一个问题:每次添加一个新的操作时,我们都需要修改switch语句,这会导致代码的冗余和不易维护。

1.3.2 使用回调函数改造后


为了简化代码,我们可以使用回调函数的方式将不同的操作函数作为参数传递给一个统一的处理函数。这样,当我们添加新的操作时,只需要添加新的函数,而不需要修改switch语句。

#include <stdio.h>int add(int a, int b) {return a + b;
}int sub(int a, int b) {return a - b;
}int mul(int a, int b) {return a * b;
}int div(int a, int b) {return a / b;
}void calculate(int (*func)(int, int)) {int x, y;printf("输入操作数:");scanf("%d %d", &x, &y);int ret = func(x, y);printf("ret = %d\n", ret);
}int main() {int input = 1;do {printf("**********\n");printf(" 1:add \n");printf(" 2:sub \n");printf(" 3:mul \n");printf(" 4:div \n");printf(" 0:exit \n");printf("**********\n");printf("请选择:");scanf("%d", &input);switch (input) {case 1:calculate(add);break;case 2:calculate(sub);break;case 3:calculate(mul);break;case 4:calculate(div);break;case 0:printf("退出程序\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}


在这个改造后的代码中,我们定义了一个calculate函数,它接受一个函数指针作为参数。这个函数指针指向一个接受两个int参数并返回int的函数。在main函数中,我们根据用户的选择将不同的操作函数传递给calculate函数,从而实现了代码的简化和模块化。

2. qsort使用举例


2.1 qsort函数简介


qsort是C标准库中的一个函数,用于对数组进行排序。它的原型如下:

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));


base:指向要排序的数组的第一个元素的指针。

nmemb:数组中元素的个数。

size:数组中每个元素的大小(以字节为单位)。

compar:指向比较函数的指针。这个函数用于比较两个元素的大小。

2.2 使用qsort函数排序整型数据


让我们通过一个简单的例子来演示如何使用qsort函数对整型数组进行排序。

#include <stdio.h>
#include <stdlib.h>int int_cmp(const void *p1, const void *p2) {return (*(int *)p1 - *(int *)p2);
}int main() {int arr[] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 0};int i = 0;qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}


在这个例子中,我们定义了一个int_cmp函数,用于比较两个整型数的大小。然后我们使用qsort函数对数组arr进行排序。qsort函数会根据int_cmp函数的返回值来决定元素的顺序。

2.3 使用qsort排序结构数据


qsort函数不仅可以用于排序基本数据类型,还可以用于排序结构体数据。让我们通过一个例子来演示如何使用qsort函数对结构体数组进行排序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct Stu {char name[20];int age;
};int cmp_stu_by_age(const void *e1, const void *e2) {return ((struct Stu *)e1)->age - ((struct Stu *)e2)->age;
}int cmp_stu_by_name(const void *e1, const void *e2) {return strcmp(((struct Stu *)e1)->name, ((struct Stu *)e2)->name);
}void test2() {struct Stu s[] = {{"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15}};int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);for (int i = 0; i < sz; i++) {printf("%s %d\n", s[i].name, s[i].age);}
}void test3() {struct Stu s[] = {{"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15}};int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);for (int i = 0; i < sz; i++) {printf("%s %d\n", s[i].name, s[i].age);}
}int main() {test2();test3();return 0;
}


在这个例子中,我们定义了一个Stu结构体,包含学生的姓名和年龄。我们定义了两个比较函数cmp_stu_by_age和cmp_stu_by_name,分别用于按照年龄和姓名对学生进行排序。然后我们使用qsort函数对结构体数组进行排序,并输出排序后的结果。

3. qsort函数的模拟实现

3.1 冒泡排序简介


冒泡排序是一种简单的排序算法。它重复地遍历要排序的数组,比较相邻的两个元素,如果它们的顺序错误就交换它们。遍历数组的工作会重复进行,直到没有需要交换的元素为止。

3.2 使用回调函数模拟实现qsort


我们可以使用冒泡排序的思想来模拟实现qsort函数。为了支持不同类型的数组,我们需要使用void *指针和回调函数。

#include <stdio.h>int int_cmp(const void *p1, const void *p2) {return (*(int *)p1 - *(int *)p2);
}void _swap(void *p1, void *p2, int size) {int i = 0;for (i = 0; i < size; i++) {char tmp = *((char *)p1 + i);*((char *)p1 + i) = *((char *)p2 + i);*((char *)p2 + i) = tmp;}
}void bubble(void *base, int count, int size, int (*cmp)(void *, void *)) {int i = 0;int j = 0;for (i = 0; i < count - 1; i++) {for (j = 0; j < count - i - 1; j++) {if (cmp((char *)base + j * size, (char *)base + (j + 1) * size) > 0) {_swap((char *)base + j * size, (char *)base + (j + 1) * size, size);}}}
}int main() {int arr[] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 0};int i = 0;bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}


在这个代码中,我们定义了一个bubble函数,它接受一个void *指针作为数组的基地址,数组的元素个数,每个元素的大小,以及一个比较函数。bubble函数使用冒泡排序算法对数组进行排序。为了支持不同类型的数组,我们使用void *指针和_swap函数来交换元素。

4. 总结


通过本文的学习,我们深入理解了指针和回调函数的概念,并通过实际的代码示例展示了它们的应用。回调函数为我们提供了一种灵活的编程方式,使得我们可以将函数作为参数传递给其他函数,从而实现更加模块化和可复用的代码。qsort函数是C标准库中的一个强大的排序函数,它通过回调函数的方式支持对不同类型的数据进行排序。我们还通过模拟实现qsort函数,进一步加深了对指针和回调函数的理解。

相关文章:

深入理解指针与回调函数:从基础到实践

引言 在C语言中&#xff0c;指针和回调函数是两个非常重要的概念。指针为我们提供了直接操作内存的能力&#xff0c;而回调函数则为我们提供了一种灵活的编程方式&#xff0c;使得我们可以将函数作为参数传递给其他函数&#xff0c;从而实现更加模块化和可复用的代码。本文将深…...

算法学习新姿势:从0开始用hello-algo搭建自己的在线学习平台

文章目录 前言1.关于hello-algo2.安装Docker和Docker compose3.本地部署hello-algo4. hello-algo本地访问5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 今天要给大家安利一款绝对不能错过的开源神器——Hello-Algo&#xff01;无论你是刚踏…...

常用 nvm 命令指南

nvm&#xff08;Node Version Manager&#xff09; 是一个用于管理 Node.js 版本的工具&#xff0c;可以轻松安装、切换和卸载不同版本的 Node.js。本文将介绍常用的 nvm 命令&#xff0c;帮助你高效管理 Node.js 环境。 1. 列出系统中通过 nvm 安装的所有 Node.js 版本 nvm l…...

后端-Java虚拟机

Java虚拟机 Java虚拟机的组成 Java虚拟机的组成由类加载器ClassLoader、运行时数据区域&#xff08;JVM管理的内存&#xff09;和执行引擎&#xff08;即时遍历器、解释器垃圾回收器&#xff09; 类加载器加载class字节码文件中的内容到内存运行时数据区域负责管理jvm使用到…...

开源PDF解析工具olmOCR

olmOCR 是由 Allen Institute for Artificial Intelligence (AI2) 的 AllenNLP 团队开发的一款开源工具&#xff0c;旨在将PDF文件和其他文档高效地转换为纯文本&#xff0c;同时保留自然的阅读顺序。它支持表格、公式、手写内容等。 olmOCR 经过学术论文、技术文档和其他文档…...

Java里的ArrayList和LinkedList有什么区别?

大家好&#xff0c;我是锋哥。今天分享关于【Java里的ArrayList和LinkedList有什么区别&#xff1f;】面试题。希望对大家有帮助&#xff1b; Java里的ArrayList和LinkedList有什么区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ArrayList 和 Lin…...

Python的循环和条件判断 笔记250303

Python的循环和条件判断 Python中的循环和条件判断是编程基础&#xff0c;以下是关键点总结及示例&#xff1a; 条件判断 语法&#xff1a;if、elif、else&#xff0c;使用缩进划分代码块。逻辑运算符&#xff1a;and、or、not。示例&#xff1a;age 18 if age < 12:prin…...

浔川官方回应

浔川官方回应 近期&#xff0c;有用户反馈《浔川社团官方文章被 Devpress 社区收录&#xff01;》一文中的文章链接&#xff0c;点击后出现无法访问的情况。在此&#xff0c;浔川社团向各位关注我们的用户致以诚挚的歉意&#xff0c;并就该问题作出如下说明&#xff1a; 经社…...

【计算机网络入门】初学计算机网络(六)

目录 1.回忆数据链路层作用 2. 组帧 2.1 四种组帧方法 2.1.1 字符计数法 2.1.2 字节填充法 2.1.3 零比特填充法 2.1.4 违规编码法 3. 差错控制 3.1 检错编码 3.1.1 奇偶校验码 3.1.2 CRC&#xff08;循环冗余校验&#xff09;校验码 3.2 纠错编码 3.2.1 海明校验码…...

摄像头应用编程(三):多平面视频采集

文章目录 1、前言2、环境介绍3、步骤4、应用程序编写5、测试5.1、编译应用程序5.2、运行应用程序 6、总结 1、前言 在查看摄像头类型时&#xff0c;大致可以分为两类&#xff1a;Video Capture 和 Video Capture Multiplanar。 本次应用程序主要针对类型为Video Capture Multi…...

用工厂函数简化redis配置

工厂函数&#xff08;Factory Function&#xff09;不同于构造函数&#xff0c;工厂函数就是一个普通函数&#xff0c;通常用于创建对象或实例。它的核心思想是通过一个函数来封装对象的创建逻辑&#xff0c;而不是直接使用类的构造函数。工厂函数可以根据输入参数动态地决定创…...

网页制作11-html,css,javascript初认识のCCS样式列表(上)

Advantage. 更加精确的控制网页的内容、形式。样式更加丰富。定义样式灵活。 一、css的基本语法 Css的语法结构由三部分组成&#xff1a; 1、选择符 Selector&#xff1a; 指这种样式编码所要针对的对象&#xff0c;可以是一个xhtml标签&#xff0c;例如body hl&#xff1b…...

VSCode 移除EmmyLua插件的红色波浪线提示

VSCode 中安装插件EmmyLua&#xff0c;然后打开lua文件的时候&#xff0c;如果lua代码引用了C#脚本的变量&#xff0c;经常出现 “undefined global variable: UnityEngineEmmyLua(undefined-global)” 的红色波浪线提示&#xff0c;这个提示看着比较烦人&#xff0c;我们可以通…...

【PHP】fastadmin框架后台开关的传值问题

文章目录 概要技术细节 概要 fastadmin的后台ui框架中&#xff0c;处理列表开关的场景比较多见&#xff0c;有时传值不是0和1&#xff0c;而是1和2&#xff0c;那么就需要调整js的代码了。 技术细节 处理开关字段的js代码&#xff1a; {field: is_sellOut,title: 销售中,yes…...

机器学习数学基础:37.统计学基础知识1

统计学基础概念入门教程 在统计学的世界里&#xff0c;概率和数据分布是基础且重要的概念&#xff0c;它们能帮助我们理解和分析各种数据现象。除此之外&#xff0c;点估计与区间估计也是在对总体参数进行推断时常用的方法。下面&#xff0c;就为统计学小白详细讲解这些关键的…...

HTB academy ---Active Directory Enumeration Attacks---An ACE in the Hole

ACL Enumeration 那么章节开始我们先枚举一下用户的GUID&#xff0c;也就是如图所示objectacetype这一块儿的内容&#xff0c;这一步的目的其实是观察我们已获得的用户对其他用户的权限&#xff0c;这个权限就是通过这个GUID得出来的&#xff08;当然枚举的时间会比较长可能需…...

2025华为OD机试真题目录【E卷+A卷+B卷+C卷+D卷】持续收录中...

摘要 本专栏提供2025最新最全的华为OD机试真题库&#xff08;EABCD卷&#xff09;&#xff0c;包括100分和200分题型。题目包含题目描述、输入描述、用例、备注和解题思路、多种语言解法&#xff08;Java/JS/Py/C/C&#xff09;。希望小伙伴们认真学习、顺利通过。 声明 本专…...

【Linux第一弹】Linux基础指令(上)

目录 1.ls指令 1.1 ls使用实例 2.pwd指令 3.cd指令 3.1 cd使用实例 4.touch指令 4.1touch使用实例 5.mkdir指令 5.1mkdir使用实例 6.rmdir指令和rm指令 6.1 rmdir指令使用实例->: 6.2 rm指令使用实例 7.man指令 8.cp指令 8.1 cp 使用实例 9.mv指令 9.1mv使用…...

linux下自旋锁(spin_lock)

文章目录 Linux自旋锁&#xff1a;单核与多核环境下的实现差异与核心原理 &#x1f5a5;️&#x1f512;一、自旋锁的核心特性 ⚙️&#x1f3af; 适用场景&#xff1a; 二、单核环境下的自旋锁实现 &#x1f6d1;1. **实现原理** &#x1f504;2. **关键代码解析** &#x1f4…...

【华为OD机考】2024E+D卷真题【完全原创题解 详细考点分类 不断更新题目 六种主流语言Py+Java+Cpp+C+Js+Go】

可上 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 oj1441了解算法冲刺训练&#xff08;备注【CSDN】否则不通过&#xff09; 文章目录 相关推荐阅读模拟 数学排序字符串基础数组基础系统设计蒙特卡洛模拟其他 栈 常规栈单调栈 队列&#xff08;题目极少&#xff0c;几乎不…...

VirtualBox虚拟机转VM虚拟机

前言&#xff1a;部分靶机只适用于VirtualBox&#xff0c;VM打不开VirtualBox的文件&#xff0c;所以需要进行转换 前置条件&#xff1a;本机已经下载VM和VirtualBox 第一步&#xff1a;文件转换 找到VirtualBox.exe所在位置&#xff0c;启动cmd窗口 文件转换的命令&#xf…...

UE5设置打开新窗口默认停靠在主窗口

打开引擎所在位置 找到路径 ...\UE_5.5\Engine\Config 找到 BaseEditorPerProjectUserSettings.ini 文件 打开后CtrlF搜索 [/Script/UnrealEd.EditorStyleSettings] 在末尾添加一行 AssetEditorOpenLocationMainWindow 保存即可,之后的项目都是默认主窗口打开...

vi常见操作命令

vi&#xff08;Visual Editor&#xff09;是Linux和Unix系统中广泛使用的文本编辑器&#xff0c;它以其高效、强大的功能深受程序员和系统管理员的喜爱。这个“常用vi命令集合.zip”压缩包包含了一份详细记录了vi编辑器常用命令的文档“常用vi命令集合.doc”。下面&#xff0c;…...

AIGC和搜索引擎的异同

AIGC&#xff08;生成式人工智能&#xff09;与搜索引擎的核心差异体现在信息处理方式和输出形态上&#xff0c;我们可以从以下维度对比&#xff1a; 一、工作原理的本质差异 信息检索机制 搜索引擎&#xff1a;基于关键词匹配&#xff08;如"中暑怎么办"→返回相关…...

【ATXServer2】Android无法正确显示手机屏幕

文章目录 现象原因分析与解决排查手机内部minicap 解决minicap问题查看移动端Android SDK版本查看minicap支持版本单次方案多次方案 现象 原因分析与解决 由于atxserver2在与Android动终端的链接过程中使用了agent&#xff1a;atxserver2-android-provider&#xff0c;按照项目…...

fps项目总结:动画蓝图

文章目录 状态不同状态的并存性。 状态 不同状态的并存性。...

Trae:国内首款AI原生IDE,编程效率大提升

今年一月&#xff0c;在新闻上看到字节跳动面向海外市场推出了一款名为Trae的AI集成开发环境&#xff08;IDE&#xff09;。起初&#xff0c;我并未给予过多关注&#xff0c;因为市面上已有不少IDE集成了AI插件&#xff0c;功能也非常全面&#xff0c;而字节跳动自家的MarsCode…...

《深度学习进阶》第8集:多模态学习与跨领域融合**

第8集&#xff1a;多模态学习与跨领域融合 在深度学习的浪潮中&#xff0c;单模态模型&#xff08;如仅处理图像或文本的模型&#xff09;已经取得了令人瞩目的成就。然而&#xff0c;随着人工智能应用场景的复杂化和多样化&#xff0c;多模态学习逐渐成为研究和应用的热点。多…...

大模型在败血症预测及围手术期管理中的应用研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与数据来源 二、败血症概述 2.1 定义与流行病学 2.2 病因与发病机制 2.3 临床表现与诊断标准 2.4 并发症与危害 三、大模型技术原理及在医疗领域的应用 3.1 大模型技术概述 3.2 大模型在医疗领…...

Hadoop架构详解

Hadoop 是一个开源的分布式计算系统&#xff0c;用于存储和处理大规模数据集。Hadoop 主要由HDFS&#xff08;Hadoop Distributed File System&#xff09;、MapReduce、Yarn&#xff08;Jobtracker&#xff0c;TaskTracker&#xff09;三大核心组件组成。其中HDFS是分布式文件…...

【操作系统】文件

文件 一、文件的概念二、文件目录2.1 FCB2.2 目录结构2.2.1 单机目录2.2.2 两级目录2.2.3 树形目录结构2.2.4 无环图目录结构 三、文件的逻辑结构和物理结构3.1 文件的逻辑结构3.1.1 顺序文件3.1.2 索引文件3.1.3 索引顺序文件 3.2 文件的物理结构3.2.1 连续分配3.2.2 隐式链接…...

我的ChatGPT怎么登不上?

近期&#xff0c;不少用户反馈在使用ChatGPT时遇到登录困难、连接超时等问题。本文将从技术角度分析常见原因&#xff0c;并提供合规、安全的解决方案&#xff0c;同时结合开发者实际需求推荐实用工具&#xff0c;助您高效应对登录障碍。 ChatGPT登录失败的常见原因 网络环境限…...

实时金融信息搜索的新突破:基于大型语言模型的智能代理框架

“An Agent Framework for Real-Time Financial Information Searching with Large Language Models” 论文地址&#xff1a;https://arxiv.org/pdf/2502.15684 摘要 在金融决策过程中&#xff0c;需要处理海量的实时信息以及复杂的时序关系。然而&#xff0c;传统的搜索引擎在…...

Linux服务器Ubuntu系统环境中安装Jupyter Notebook并且配置内核以便在网页端调用

一、前提 在使用终端访问&#xff0c;并且个人目录下已创建环境。如果还不知道创建环境和安装包&#xff0c;请参考之前文章 机器学习模型算法代码需要在环境中安装的库和包 二、安装相关库Jupyter Notebook 使用pip 或 conda指令安装&#xff0c;确保服务器上安装了 Python …...

Magic 1-For-1: 在一分钟内生成一分钟视频片段(基于Python实现,视频生成模型)

一、前言 文章所有代码都使用Python实现&#xff0c;并且可以分享开源&#xff0c;文章末尾联系博主或者往期文章末尾联系&#xff0c;欢迎探讨学习分享专业领域前言研究和技术分享。 二、摘要 在本技术报告中&#xff0c;我们介绍了 Magic 1-For-1 &#xff08;Magic141&#…...

基于RK3588的重症监护信息系统应用解决方案

重症监护信息系统是医院临床信息系统的重要组成部分&#xff0c;也是医院信息化建设的重要组成部分。通过集成化的电子病历、实时监测、决策支持等功能&#xff0c;提高重症患者的诊疗效率和质量。 图片来源于网络 重症监护信息系统主要由数据信息采集单元、信息处理单元、通信…...

二十三种设计模式

2 工厂方法模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通…...

网络安全六层模型

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、单选题&#xff08;一&#xff09; 1、在以下人为的恶意攻击行为中&#xff0c;属于主动攻击的是&#xff08; &#xff09;A A&#xff0e;数据篡改及破坏 B…...

BrainSCK:通过知识注入和再激活进行大脑结构和认知对齐以诊断脑部疾病

文章目录 BrainSCK: Brain Structure and Cognition Alignment via Knowledge Injection and Reactivation for Diagnosing Brain Disorders摘要方法实验结果 BrainSCK: Brain Structure and Cognition Alignment via Knowledge Injection and Reactivation for Diagnosing Bra…...

【在Spring Boot项目中接入Modbus协议】

【在Spring Boot项目中接入Modbus协议】 在Spring Boot项目中接入Modbus协议&#xff0c;可以通过使用第三方库&#xff08;如jamod或modbus4j&#xff09;来实现。以下是一个基本的步骤指南&#xff0c;帮助你在Spring Boot项目中集成Modbus。 1. 添加依赖 首先&#xff0c;…...

CSS_复合选择器

目录 7. 复合选择器 7.1 交集选择器 7.2 并集选择器 7.3 后代选择器 7.4 子代选择器 7.5 兄弟选择器 7.6 属性选择器 7.7 伪类选择器 7.7.1动态伪类 7.7.2结构伪类 7.7.3否定伪类 7.7.4 UI伪类 7.7.5 目标选择器 7. 复合选择器 7.1 交集选择器 作用&#xff1a;…...

QT-信号与槽

1.在注册登录的练习里面&#xff0c;追加一个QListWidget项目列表 要求:点击注册之后&#xff0c;将账号显示到列表窗口小部件上面去 以及&#xff0c;在列表窗口小部件中双击某个账号的时候&#xff0c;将该账号删除 头文件 #ifndef WIDGET_H #define WIDGET_H #include <…...

在python语言中,请详细介绍一下比较运算符中等于符号(==)的情况?

李升伟 整理 一、有关思考 嗯&#xff0c;我现在要详细了解一下Python中的等于运算符&#xff08;&#xff09;。首先&#xff0c;我得回忆一下自己之前学过的知识&#xff0c;可能有些地方不太确定&#xff0c;需要仔细思考或者查阅资料。 首先&#xff0c;等于运算符&#…...

halcon学习笔记1

环境的搭建就不说了&#xff0c;主要是作者在入职后的实际学习与实践。 打开应用程序 这里作者的个人理解是1号区域主要是可以观察到读取的图像以及后续对图像进行何种操作&#xff0c;2的算子类似于Opencv中的API&#xff0c;可以在上面进行参数的调整&#xff0c;例如read_I…...

解决寻找两个正序数组中位数问题:C语言实现与解析

在算法学习和实际编程应用中&#xff0c;处理数组相关的问题是很常见的。其中&#xff0c;寻找两个正序数组的中位数就是一个经典的题目&#xff0c;不仅考验对数组操作的熟悉程度&#xff0c;还涉及到对算法效率的考量。今天&#xff0c;我们就来深入探讨如何使用C语言解决这一…...

在 ArcGIS Pro 中描绘和绘制流域

查找数字高程模型 (DEM) 对于 DEM&#xff0c;我使用了USGS Lidar Explorer 地图。该地区有 10m 分辨率的 DEM。 设置坐标系 将坐标系设置为 UTM&#xff0c;以尽量减少失真&#xff0c;并使工具在后续过程中进行更精确的计算。对于俄勒冈州&#xff0c;这是 UTM 区域 10。 …...

在华为统信UOS中安装Anaconda,并配置PyCharm

这里写目录标题 1. 下载Anaconda安装包2. 打开终端3. 安装Anaconda4.下载安装PyCharm 1. 下载Anaconda安装包 首先打开 Anaconda官网 : https://www.anaconda.com/products/distribution&#xff0c;接受或拒绝网站投喂的饼干 然后输入自己的邮箱后&#xff0c;进入下载页面…...

谈谈 HTTPS 的工作原理,SSL / TLS 握手流程是什么?

一、HTTPS 核心机制&#xff1a;非对称加密 对称加密 HTTPS HTTP over TLS/SSL&#xff0c;通过 ​混合加密体系​ 解决三大问题&#xff1a; ​防窃听​ - 对称加密传输内容&#xff08;如 AES&#xff09;​防篡改​ - 数字签名验证数据完整性​防冒充​ - 数字证书验证服…...

Linux虚拟机网络配置-桥接网络配置

简介 本文档旨在指导用户如何在虚拟环境中配置Linux系统的桥接网络&#xff0c;以实现虚拟机与物理主机以及外部网络的直接通信。桥接网络允许虚拟机如同一台独立的物理机一样直接连接到物理网络&#xff0c;从而可以被分配一个独立的IP地址&#xff0c;并能够与网络中的其他设…...

‌Transformer架构

‌核心原理‌ ‌自注意力机制‌ 通过计算输入序列中每个位置与其他位置的关联权重&#xff08;Query-Key匹配&#xff09;&#xff0c;动态聚合全局信息&#xff0c;解决了传统RNN/CNN的长距离依赖问题‌。 实现公式&#xff1a;Attention(Q,K,V)softmax(QKTdk)VAttention(…...