static关键字在嵌入式C编程中的应用
目录
一、控制变量的存储周期和可见性
1.1. 局部静态变量
1.2. 全局静态变量
二、控制函数的可见性
2.1. 静态函数
2.2. 代码示例(假设有两个文件:file1.c和file2.c)
三、应用场景
3.1. 存储常用数据
3.2. 实现内部辅助函数
四、注意事项
4.1. 作用域限制
4.2. 避免命名冲突
4.3. 使用extern关键字共享变量或函数
4.4. 代码可读性和可维护性
4.5. 静态局部变量的生命周期
4.6. 静态全局变量的链接属性
五、总结
在嵌入式 C 编程中,static
关键字是一个非常重要的工具,它在变量和函数的定义中发挥着多种关键作用,有助于优化代码结构、节省内存资源以及增强程序的模块化和可靠性。
一、控制变量的存储周期和可见性
1.1. 局部静态变量
定义:在函数内部定义的,并使用static
关键字修饰的变量,称为局部静态变量。
特性:
- 局部静态变量在函数调用结束后不会被销毁,而是保持其值和存在。
- 常用于需要跨函数调用保持状态的场景,如计数器或状态标志。
存储位置:存储在全局数据区(静态存储区),其生命周期从程序开始运行到程序结束。
可见性:只在定义它的函数内部可见。
代码示例:
#include <stdio.h>void functionWithStaticVar() {static int counter = 0; // 局部静态变量,初始化为0counter++;printf("Counter: %d\n", counter);
}int main() {functionWithStaticVar(); // 输出: Counter: 1functionWithStaticVar(); // 输出: Counter: 2functionWithStaticVar(); // 输出: Counter: 3return 0;
}
在上述示例中,counter
是一个局部静态变量,它在functionWithStaticVar
函数被首次调用时初始化为0。每次调用该函数时,counter
的值都会递增,并且在函数调用结束后保持其值。
1.2. 全局静态变量
定义:在文件作用域(即全局作用域)中使用static
关键字修饰的变量,称为全局静态变量。
特性:
- 全局静态变量的作用域仅限于声明它的文件内,其他文件无法直接访问。
- 有助于避免全局命名空间的污染和变量名的冲突。
存储位置:存储在全局数据区(静态存储区),其生命周期与程序相同。
可见性:只在声明它的文件内部可见,其他文件即使使用extern
声明也无法访问。
代码示例(假设有两个文件:file1.c
和file2.c
):
file1.c:
#include <stdio.h>static int globalStaticVar = 42; // 全局静态变量void printGlobalStaticVar() {printf("Global Static Var: %d\n", globalStaticVar);
}
file2.c:
#include <stdio.h>// extern int globalStaticVar; // 这行会导致编译错误,因为globalStaticVar在file1.c中是static的void tryToAccessGlobalStaticVar() {// printf("Global Static Var (from file2): %d\n", globalStaticVar); // 这行也会导致编译错误printf("Cannot access globalStaticVar from file2.c because it is static in file1.c\n");
}int main() {printGlobalStaticVar(); // 正确调用file1.c中的函数tryToAccessGlobalStaticVar(); // 尝试访问但失败,输出提示信息return 0;
}
在file1.c
中,globalStaticVar
是一个全局静态变量,它只在file1.c
内部可见。在file2.c
中,即使我们尝试使用extern
关键字来声明globalStaticVar
,编译器也会报错,因为它无法访问file1.c
中的全局静态变量。因此,在tryToAccessGlobalStaticVar
函数中,我们输出了一条提示信息,说明无法从file2.c
访问file1.c
中的全局静态变量。
注意:在实际编译和链接过程中,需要将
file1.c
和file2.c
一起编译并链接成一个可执行文件。上述示例仅用于说明全局静态变量的可见性限制。
二、控制函数的可见性
在C语言中,通过static
关键字可以定义静态函数,这种函数具有特殊的可见性特性。
2.1. 静态函数
定义:在函数的返回类型前加上static
关键字,这样的函数就被定义为静态函数。
特性:
- 静态函数只在当前文件(即定义它的源文件)中可见。
- 其他文件即使使用
extern
关键字也无法声明或调用静态函数。 - 这种特性使得静态函数成为实现仅在当前文件中使用的辅助函数的理想选择,例如内部数据处理函数、工具函数或私有接口。
存储位置:静态函数与普通函数在存储位置上没有本质区别,它们都存储在程序的代码段中。但是,链接器在处理静态函数时,会将其标记为仅在定义它的文件中可见。
可见性:由于静态函数的可见性被限制在定义它的文件中,因此它们不会与其他文件中的同名函数发生冲突。这有助于避免命名空间的污染,并提高了代码的可维护性和可靠性。
2.2. 代码示例(假设有两个文件:file1.c
和file2.c
)
file1.c:
#include <stdio.h>static void staticFunction() {printf("This is a static function in file1.c\n");
}void publicFunction() {staticFunction(); // 调用静态函数printf("This is a public function in file1.c\n");
}
file2.c:
#include <stdio.h>// extern void staticFunction(); // 这行会导致链接错误,因为staticFunction在file1.c中是static的void anotherFunction() {// staticFunction(); // 这行也会导致链接错误,因为staticFunction在file1.c中不可见printf("This is another function in file2.c\n");
}int main() {publicFunction(); // 正确调用file1.c中的publicFunction// staticFunction(); // 这行会导致链接错误,因为staticFunction在file1.c中不可见anotherFunction(); // 调用file2.c中的函数return 0;
}
在file1.c
中,staticFunction
是一个静态函数,它只在file1.c
内部可见。publicFunction
是一个普通函数,它可以在其他文件中被调用(只要进行了正确的声明和链接)。在file2.c
中,我们尝试声明和调用staticFunction
,但都会导致链接错误,因为staticFunction
在file1.c
中是静态的,不可见。
注意:在实际编译和链接过程中,需要将file1.c
和file2.c
一起编译并链接成一个可执行文件。上述示例仅用于说明静态函数的可见性限制。
通过使用静态函数,我们可以更好地组织代码,将实现细节隐藏在源文件中,只暴露必要的接口给其他文件。这有助于提高代码的可读性、可维护性和可靠性。
三、应用场景
在嵌入式系统开发中,static
关键字的应用非常广泛,特别是在控制变量的存储周期、可见性以及函数的可见性方面。
3.1. 存储常用数据
应用场景:在嵌入式系统中,经常需要存储一些常用的数据,如配置参数、计数器、状态标志等。这些数据在程序执行过程中可能会被频繁访问。
优势:
- 使用
static
变量可以避免在栈上频繁地进行内存分配和释放,因为static
变量存储在静态存储区,其生命周期贯穿整个程序运行过程。 static
变量在函数调用结束后不会被销毁,而是保持其值和存在,这对于需要跨函数调用保持状态的场景非常有用。- 通过将常用数据定义为
static
变量,可以提高程序的效率和稳定性。
示例:
// 假设这是一个嵌入式系统的配置文件
#include <stdint.h>static uint16_t baudRate = 9600; // 配置参数:波特率
static uint8_t errorFlag = 0; // 状态标志:错误标志
static uint32_t packetCounter = 0; // 计数器:数据包计数器// 函数用于更新计数器
void incrementPacketCounter() {packetCounter++;
}// 函数用于检查错误标志
int isError() {return errorFlag;
}
3.2. 实现内部辅助函数
应用场景:在嵌入式系统中,经常需要实现一些内部的辅助函数,如计算CRC校验值、数据转换、时间处理等。这些函数通常只在当前文件中被调用。
优势:
- 使用
static
函数可以避免与其他文件中的函数重名,从而避免命名冲突。 static
函数提高了程序的可维护性和可靠性,因为它们被封装在定义它们的源文件中,不会暴露给外部文件。- 通过将内部辅助函数定义为
static
函数,可以清晰地划分模块的内部接口和外部接口。
示例:
// 假设这是一个处理通信数据的源文件
#include <stdint.h>
#include <stdbool.h>// 静态函数:计算CRC校验值
static uint8_t calculateCRC(uint8_t *data, uint16_t length) {// CRC计算逻辑...return crcValue; // 假设crcValue是计算得到的CRC值
}// 公共函数:发送数据并计算CRC
bool sendDataWithCRC(uint8_t *data, uint16_t length) {uint8_t crc = calculateCRC(data, length);// 发送数据和CRC的逻辑...return true; // 假设发送成功
}
在上面的示例中,calculateCRC
是一个静态函数,它只在当前文件中被调用。由于它是静态的,因此不会与其他文件中的同名函数发生冲突。sendDataWithCRC
是一个公共函数,它调用了calculateCRC
来计算CRC校验值,并发送数据和CRC。
通过合理使用
static
变量和函数,嵌入式系统的开发者可以更好地组织代码、提高程序的效率和稳定性、避免命名冲突,并清晰地划分模块的内部接口和外部接口。
四、注意事项
在嵌入式系统或其他C语言编程环境中使用static
关键字时,需要注意以下几个方面:
4.1. 作用域限制
- 变量:
static
变量(无论是全局还是局部)的作用域仅限于定义它们的文件。这意味着它们不能被其他文件中的代码直接访问或修改。 - 函数:
static
函数的作用域同样仅限于定义它们的文件。其他文件无法调用这些函数,即使它们的名字相同也不会发生冲突。
4.2. 避免命名冲突
由于static
变量和函数的作用域被限制在定义它们的文件中,因此它们不会与其他文件中的同名变量或函数发生冲突。这是static
关键字的一个重要优势,但也需要开发者在使用时注意命名规范,以避免在同一文件的不同部分或不同文件中出现意外的命名重复。
4.3. 使用extern关键字共享变量或函数
如果需要在多个文件之间共享变量或函数,应该使用extern
关键字而不是static
。extern
关键字用于声明在其他文件中定义的变量或函数,从而允许在多个文件中访问它们。
4.4. 代码可读性和可维护性
- 可读性:
static
关键字的使用可以提高代码的可读性,因为它清晰地表明了变量或函数的作用域。然而,过度使用static
可能会导致代码结构过于复杂,难以理解和维护。 - 可维护性:在使用
static
时,应确保代码结构清晰,避免不必要的复杂性。例如,不要将全局状态隐藏在多个静态变量中,而是应该考虑使用结构体或类来组织这些状态。
4.5. 静态局部变量的生命周期
对于静态局部变量(在函数内部定义的static
变量),它们的生命周期贯穿整个程序运行过程,而不是像普通局部变量那样在函数调用结束时销毁。这意味着静态局部变量在函数调用之间会保持其值。这一点在需要跨函数调用保持状态的场景中非常有用,但也需要小心处理,以避免意外的副作用。
4.6. 静态全局变量的链接属性
静态全局变量(在文件作用域内定义的static
变量)具有内部链接属性,这意味着它们只能被定义它们的文件访问。这与普通全局变量(没有使用static
关键字的全局变量)形成对比,后者具有外部链接属性,可以被其他文件通过extern
声明访问。
static
关键字在C语言编程中是一个强大的工具,可以用于控制变量和函数的作用域、避免命名冲突以及提高代码的可读性和可维护性。然而,它的使用也需要谨慎处理,以避免不必要的复杂性和潜在的错误。
五、总结
在嵌入式C编程领域,static
关键字无疑扮演着举足轻重的角色。它不仅能够有效地调控变量的存储周期与可见性,还能精准地控制函数的可见范围,进而为程序带来更高的执行效率和更出色的可维护性。
首先,通过static
关键字定义的变量,其生命周期得以延长至整个程序运行期间,且其可见性被严格限制在定义它们的文件内部。这一特性使得static
变量成为存储常用数据、配置参数、计数器以及状态标志等信息的理想选择。相较于在栈上频繁分配和释放内存的变量,static
变量能够显著提升程序的运行效率,并减少潜在的内存管理错误。
其次,static
函数的应用进一步增强了代码的内聚性和封装性。通过将内部辅助函数定义为static
,我们可以确保它们不会被其他文件调用,从而避免了命名冲突,并提高了程序的可读性和可维护性。这种封装性有助于开发者更好地组织代码,将实现细节隐藏在源文件中,仅暴露必要的接口给外部使用。
然而,值得注意的是,static
关键字的使用也需遵循一定的原则。过度依赖static
可能会导致代码结构过于复杂,难以理解和维护。因此,在编写嵌入式软件时,我们应合理、审慎地使用static
关键字,以确保代码既清晰高效,又易于维护和扩展。
综上所述,static
关键字在嵌入式C编程中发挥着不可或缺的作用。通过合理利用其特性,我们可以编写出更加高效、可靠且易于维护的嵌入式软件。
相关文章:
static关键字在嵌入式C编程中的应用
目录 一、控制变量的存储周期和可见性 1.1. 局部静态变量 1.2. 全局静态变量 二、控制函数的可见性 2.1. 静态函数 2.2. 代码示例(假设有两个文件:file1.c和file2.c) 三、应用场景 3.1. 存储常用数据 3.2. 实现内部辅助函数 四、注…...
图形开发基础之在WinForms中使用OpenTK.GLControl进行图形绘制
前言 GLControl 是 OpenTK 库中一个重要的控件,专门用于在 Windows Forms 应用程序中集成 OpenGL 图形渲染。通过 GLControl,可以轻松地将 OpenGL 的高性能图形绘制功能嵌入到传统的桌面应用程序中。 1. GLControl 的核心功能 OpenGL 渲染上下文&…...
macOS sequoia 15.1中应用程序“程序坞”没有权限打开
在macOS sequoia 15.1版本中新安装的应用程序在访达中打开报错显示应用程序“程序坞”没有权限打开“(null)”。 解决办法 在启动台中找到终端,点击打开,切换到应用目录下,输入 cd /Applications/ 找到需要打开的应用程序目录࿰…...
汉诺塔递归问题(C++)
汉诺塔递归问题 汉诺塔是典型的递归问题,这个问题可以这样描述: 完成目标: 将n个盘子从A搬运到C,求需要移动多少次完成? **约束条件:**搬运的过程中每次只能移动一个盘子,且不能出现大的盘子…...
【开源】A060-基于Spring Boot的游戏交易系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…...
抖音SEO短视频矩阵源码私有化部署
为了开发一套高效的抖音短视频SEO矩阵系统,开发者需要掌握以下核心技术: 网络编程:具备使用Python、Java或其他编程语言进行网络编程的能力,能够利用爬虫技术从抖音平台获取数据。 数据处理:熟悉并能够应用数据处理工…...
深入浅出:Python 编程语言的学习之路
文章目录 1. Python 简介2. Python 的安装与环境配置2.1 安装 Python2.2 配置开发环境 3. Python 基础语法3.1 变量与数据类型示例代码:定义变量 3.2 控制结构示例代码:条件语句示例代码:循环语句 3.3 函数与模块示例代码:定义函数…...
R语言机器学习论文(三):特征提取
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据一、数据归一化二、离散型分类变量的编码三、筛选特征四、重要特征五、输出结果六、总结系统信息介绍 在数据分析和机器学习项目中,经常需要对数据进行预…...
【C#设计模式(17)——迭代器模式(Iterator Pattern)】
前言 迭代器模式可以使用统一的接口来遍历不同类型的集合对象,而不需要关心其内部的具体实现。 代码 //迭代器接口 public interface Iterator {bool HashNext();object Next(); } //集合接口 public interface Collection {Iterator CreateIterator(); } //元素迭…...
【云原生系列】云计算中的负载均衡是什么,有什么用
云计算里有一个非常重要的概念叫“负载均衡”,如果你经常听到这个词但还不太明白具体是怎么回事,这篇文章可以给你一些思路。负载均衡简单来说就是“分担压力”,确保访问量被合理地分配到各个服务器上,让系统高效且稳定地运行。 …...
笔记本电脑usb接口没反应怎么办?原因及解决方法
笔记本电脑的USB接口是我们日常使用中非常频繁的一个功能,无论是数据传输、充电还是外接设备,都离不开它。然而,当USB接口突然没有反应时,这无疑会给我们的工作和学习带来不小的困扰。下面,我们就来探讨一下笔记本USB接…...
容器运行应用及Docker命令
文章目录 一、使用容器运行Nginx应用1_使用docker run命令运行Nginx应用1 观察下载容器镜像过程2 观察容器运行情况 2_访问容器中运行的Nginx服务1 确认容器IP地址2 容器网络说明3 使用curl命令访问 二、Docker命令1_Docker命令获取帮助方法2_Docker官网提供的命令说明3_docker…...
PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images
全文摘要 本文介绍了一种名为PETRv2的统一框架,用于从多视图图像中进行三维感知。该框架基于先前提出的PETR框架,并探索了时间建模的有效性,利用前一帧的时间信息来提高三维物体检测效果。作者在PETR的基础上扩展了三维位置嵌入(…...
Python库常用函数-数据分析
Python库常用函数 1.pandas库 (1)数据读取与写入 读取 CSV 文件: data pd.read_csv(file.csv)读取 Excel 文件: data pd.read_excel(file.xlsx, sheet_nameSheet1)写入 CSV 文件: data.to_csv(new_file.csv, ind…...
【机器学习】机器学习的基本分类-监督学习-随机森林(Random Forest)
随机森林是一种基于集成学习(Ensemble Learning)思想的算法,由多个决策树构成。它通过结合多棵决策树的预测结果来提升模型的泛化能力和准确性,同时减少过拟合的风险。 1. 随机森林的核心思想 多样性: 随机森林通过引…...
Java入门:22.集合的特点,List,Set和Map集合的使用
1 什么是集合 本质就是容器的封装,可以存储多个元素 数组一旦创建,长度就不能再改变了。 数组一旦创建,存储内容的类型不能改变。 数组可以存储基本类型,也可以存储引用类型。 数组可以通过length获得容量的大小,但…...
Web3与区块链如何通过智能合约实现自动化生态?
Web3和区块链正在重塑互联网的未来,其核心在于去中心化和用户数据自主权。而作为区块链技术的重要组成部分,智能合约通过自动执行预设规则,大大提升了效率和安全性。本文将探讨Web3与区块链如何通过智能合约实现生态的自动化。 什么是智能合约…...
排序算法入门:分类与基本概念详解
引言 排序是编程世界中最常见的操作之一,也是许多算法的基础。不管是从数据中找出最大值还是将一堆乱序的名字整理得井井有条,排序算法都在幕后默默工作。你可能会觉得排序很简单:从小到大排个序而已嘛。但当数据量大到上百万、上亿…...
【Spring Cloud 微服务的简单概述】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
稳定运行的以Azure Synapse Dedicated SQL Pool数据仓库为数据源和目标的ETL性能变差时提高性能方法和步骤
在Azure Synapse Dedicated SQL Pool(以前称为SQL Data Warehouse)的ETL性能变差时,可以通过以下方法和步骤来提高性能: 1. 分析和监控性能瓶颈 查看执行计划:使用SQL的SET STATISTICS IO ON和SET STATISTICS TIME O…...
可供参考的GitHub国内镜像
在配置了本地hosts文件和魔法后仍存在无法访问的问题 针对如上问题,可以使用国内的镜像地址做替换 例如: https://github.com/bubbliiiing/detr-pytorch改成 https://hub.nuaa.cf/bubbliiiing/detr-pytorch推荐使用的镜像 https://hub.yzuu.cf/ https://hub.nua…...
统计中间件稳定性指标
目前订单业务域涉及中间件:MySQL、Redis、TiDB、MQ、ES。(遗漏项请补充) 一、RDS 资源使用率 实例ID实例名称规格maxCPUavgCPUmaxDISKmaxIOPSavgIOPS活跃会话maxTPSavgTPSmaxQPSavgQPS实例风险 慢查询 慢查询会消耗大量的系统资源&#x…...
Qt Quick开发基础+实战(持续更新中…)
最近更新日期:2024/12/4 一、Qt Quick简介 写在前面: 本篇文章虽然只是作为我的学习笔记,但也作为我日后复习之用,所以会认真并详细记录,但会分重点。 1.3 新建Qt Quick Application工程 这节主要讲2个知识点&#x…...
FPGA Xilinx维特比译码器实现卷积码译码
FPGA Xilinx维特比译码器实现卷积码译码 文章目录 FPGA Xilinx维特比译码器实现卷积码译码1 Xilinx维特比译码器实现2 完整代码3 仿真结果 MATLAB (n,k,m)卷积码原理及仿真代码(你值得拥有)_matlab仿真后代码-CSDN博客 MATLAB 仿真…...
数据结构初阶1 时间复杂度和空间复杂度
本章重点 算法效率时间复杂度空间复杂度常见时间复杂度以及复杂度OJ练习 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢?比如对于以下斐波那契数列: long long Fib(int N) { if(N < 3) return 1;return Fib(N-1) Fib(N-2); }斐…...
基于Matlab计算机视觉的车道线识别与前车检测系统研究
随着自动驾驶技术的发展,车道线识别和前车检测成为智能驾驶系统中的核心技术之一。本实训报告围绕基于计算机视觉的车道线识别与前车检测系统展开,旨在通过处理交通视频数据,实时检测车辆所在车道及其与前车的相对位置,从而为车道…...
刷蓝桥杯历年考题(更新至15届~)
第十五届 CA组省赛 AcWing5980.训练士兵 方法一:树状数组:O(nlogn) self-complete /*先枚举组团,后分析每个士兵,有一个特点,组团费用是固定的,那当然是让所有士兵一块训练,训练完的士兵也不会有损失当还…...
Stream API来提取两个字符串字段
如果您有一个包含对象的List,并且想要使用Java 8的Stream API来提取两个字符串字段,然后将这些字段的值连接成一个以逗号隔开的单个字符串或者集合List,您可以按照以下步骤操作: 假设您有一个Person类,其中包含两个字…...
《无畏契约》运行时提示“d3dcompiler_43.dll丢失”是什么原因?“找不到d3dcompiler_43.dll文件”如何解决?
《无畏契约》运行时提示“d3dcompiler_43.dll丢失”是什么原因?“找不到d3dcompiler_43.dll文件”如何解决? 作为一位软件开发从业者,我深知在游戏运行过程中,遇到各种文件丢失、文件损坏和系统报错等问题是多么令人头疼。今天&a…...
社群分享在商业引流与职业转型中的作用:开源 AI 智能名片 2+1 链动模式小程序的应用契机
摘要:本文聚焦于社群分享在商业领域的重要性,阐述其作为干货诱饵在引流方面的关键意义。详细探讨了提供有价值干货的多种方式,包括文字分享、问题解答以及直播分享等,并分析了直播分享所需的条件。同时,以自身经历为例…...
芯食代冻干科技研究院:创新与品质并重,推动家用冻干机高质量发展
11月25日,芯食代首届食品冻干前沿与智能化升级创新大会在江苏常州成功举办。本次大会由芯食代冻干科技研究院(江苏)有限公司与芯食代(上海)科技发展有限公司联合主办,云集学界专家教授、商界企业精英,共议家用冻干机的未来创新发展。作为创新大会,芯食代冻干科技研究院也在本次…...
【C++】栈和队列的模拟实现(适配器模式)
不论是C语言还是C,我们都用其对应的传统写法对栈和队列进行了模拟实现,现在我们要用新的方法模拟实现栈和队列,这个新方法就是适配器模式。 C语言传统写法: C语言模拟实现栈 C传统写法:C模拟实现栈 1.容器适配器 …...
CSS过渡练习-进度条(12)
该进度条先需要一个大盒子和一个小盒子,然后给大盒子与小盒子加style,看进度到多少就是百分之多少;如果要进度条从百分之五十到满格的话就加一个hover的样式(鼠标移到链接上时添加的特殊样式),然后是想要进…...
青动CRM系统PHP+Uniapp
全面解决企业销售团队的全流程客户服务难题,旨在助力企业销售全流程精细化、数字化管理,全面解决企业销售团队的全流程客户服务难题,帮助企业有效盘活客户资源、量化销售行为,合理配置资源、建立科学销售体系,提升销售业绩。 青动…...
word如何快速创建目录?
文章目录 1,先自己写出目录的各级标题。2、选中目标标题,然后给它们编号3、给标题按照个人需求开始分级4、插入域构建目录。4.1、利用快捷键插入域构建目录4.2、手动插入域构建目录 听懂掌声!学会了吗? 前提声明:我在此…...
【机器学习】机器学习的基本分类-监督学习-决策树-CART(Classification and Regression Tree)
CART(Classification and Regression Tree) CART(分类与回归树)是一种用于分类和回归任务的决策树算法,提出者为 Breiman 等人。它的核心思想是通过二分法递归地将数据集划分为子集,从而构建一棵树。CART …...
使用GDI对象绘制UI时需要注意的若干细节问题总结
目录 1、一个bitmap不能同时被选进两个dc中 2、CreateCompatibleDC和CreateCompatibleBitmap要使用同一个dc作为参数 3、不能删除已经被选入DC中的GDI对象 4、使用完的GDI对象,要将之释放掉,否则会导致GDI对象泄漏 5、CreateCompatibleBitmap返回错…...
C++:std::fstream详细介绍
std::fstream 是 C 标准库中的一个类,用于处理文件的输入输出操作。它可以同时进行文件的读和写操作,因此被称为“文件流”(File Stream)。它是 C 输入输出流库 iostream 的一部分,继承了 std::istream 和 std::ostrea…...
ndp协议简介
在IPv6中,ARP(地址解析协议)被替代为邻居发现协议(Neighbor Discovery Protocol,NDP)。NDP是IPv6网络中用于发现邻居节点(相邻设备)的协议,类似于IPv4中的ARP。但与ARP不…...
915DEBUG-obsidianTemplater使用
Templater使用 tp函数不正常显示相应数据 模板使用方式不正确 <% tp.date.now("YYYY-MM-DD") %> 应该被放置在一个被Templater识别为模板的文件中,或者在你使用Templater的插入模板功能时输入。如果只是在一个普通的Markdown文件中直接输入这段代码…...
【Linux篇】权限管理 - 用户与组权限详解
一. 什么是权限? 首先权限是限制人的。人 真实的人 身份角色 权限 角色 事物属性 二. 认识人–用户 Linux下的用户分为超级用户和普通用户 root :超级管理员,几乎不受权限的约束普通用户 :受权限的约束超级用户的命令提示符是#,普通用…...
JWT 在 SaaS 系统中的作用与分布式 SaaS 系统设计的最佳实践
在现代 SaaS(软件即服务) 系统中,随着服务规模的扩大和用户需求的多样化,如何高效、安全地进行用户身份验证、权限控制以及租户隔离,成为了系统架构中的核心问题之一。**JWT(JSON Web Token)**作…...
docker更换容器存储位置
一:原因 今天之前在某个服务器上使用docker搭建的服务突然无法访问了,进入服务器查看发现服务运行正常,但是就是无法使用,然后我这边准备将docker服务重新启动下看看,发现docker服务无法重启,提示内存已满…...
gitlab-cicd部署安装与具体操作
一、安装 本例中是用安装包直接在ubuntu下安装的,也可以用docker镜像。 curl -LJO https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_amd64.rpmrpm -i gitlab-runner_amd64.rpm 安装runner后,需要跟在runner所在服务器安装…...
基于MFC实现的人机对战五子棋游戏
基于MFC实现的人机对战五子棋游戏 1、引言 此报告将详细介绍本次课程设计的动机、设计思路及编写技术的详细过程,展现我所学过的C知识以及我通过本次课程设计所学到例如MFC等知识。在文档最后我也会记录我所编写过程遇到的问题以及解决方案。 1.1 背景 五子棋是…...
mac电脑多个ssh keys共存
一、同一台电脑,不同域名的git仓库为什么要设置不同的ssh keys? 每个git仓库通常要求使用唯一的ssh key,以防止权限冲突和安全问题。 权限控制:每个git仓库的权限是独立的,使用不同的ssh keys可以更好的管理权限&…...
Elasticsearch数据迁移(快照)
1. 数据条件 一台原始es服务器(192.168.xx.xx),数据迁移后的目标服务器(10.2.xx.xx)。 2台服务器所处环境: centos7操作系统, elasticsearch-7.3.0。 2. 为原始es服务器数据创建快照 修改elas…...
【Java-数据结构篇】Java 中栈和队列:构建程序逻辑的关键数据结构基石
我的个人主页 我的专栏:Java-数据结构,希望能帮助到大家!!!点赞❤ 收藏❤ 一、引言 1. 栈与队列在编程中的角色定位 栈和队列作为两种基本的数据结构,在众多编程场景中都有着独特的地位。它们为数据的有序…...
使用ensp搭建内外互通,使用路由跨不同vlan通信。
1.网络拓扑图 2.规则 (1)允许 (自己)ping通内外网,内外网随便一个pc就可以. (2) 允许(电信)ping通内外网,内外网随便一个pc就可以 (时间问题不做…...
URDF 发布者
URDF 发布者 #! /usr/bin/env python3 import rclpy from rclpy.node import Node import rclpy.parameter from sensor_msgs.msg import JointState from rcl_interfaces.msg import SetParametersResultimport threading import timeclass RotateWheelNode(Node):def __init…...