嵌入式 C 语言:一维数组
目录
一、定义
二、内存布局
三、数组的初始化
3.1. 完全初始化
3.2. 部分初始化
3.3. 不指定大小初始化
四、使用数组
4.1. 访问数组元素
4.1.1. 通过索引访问数组元素
4.1.2. 通过指针访问数组元素
4.2. 遍历数组
4.3. 数组作为函数参数
五、应用场景
5.1. 数据采集与存储
5.2. 数据缓冲
5.3. 查找与排序
六、注意事项
6.1. 内存管理
6.2. 数组边界
6.3. 初始化
6.4. 类型匹配
6.5. 指针与数组
6.6. 性能考虑
6.7. 代码可读性
在嵌入式系统开发中,一维数组是C语言中一种基本的数据结构,用于存储相同类型的多个元素。
一、定义
在嵌入式 C 语言中,一维数组是一种基本的数据结构,用于存储一组相同类型的数据元素。它可以被看作是一个连续的内存块,其中每个元素都有相同的大小并且按照顺序排列。
一维数组的定义方式如下:
数据类型 数组名[数组大小];
例如,定义一个存储5个整数的数组:
int numbers[5];
数据类型可以是基本数据类型(如int
、char
、float
等),也可以是用户自定义的数据类型(如结构体、枚举等)。
二、内存布局
在C语言中,数组元素在内存中是连续存储的,意味着数组的每个元素都紧挨着前一个元素,并且每个元素都占用相同大小的内存空间。这种连续的内存布局有几个重要的含义:
-
地址计算:给定数组的起始地址和元素的大小,可以很容易地计算出数组中任意元素的地址。对于
int arr[5];
,如果起始地址是0x1000
,并且int
类型占4个字节,那么arr[i]
的地址就是起始地址 + i * 元素大小
。因此,arr[0]
的地址是0x1000
,arr[1]
的地址是0x1000 + 4
(即0x1004
),以此类推。 -
指针运算:由于数组元素在内存中是连续的,因此可以使用指针来遍历数组。指针可以看作是一个变量,它存储了内存地址。通过给指针加上或减去一个整数,可以移动到数组中的下一个或上一个元素(假设这个整数是元素的大小)。这种指针运算在C语言中非常常见,特别是在处理数组和字符串时。
-
性能优势:连续的内存布局可以提高数组访问的性能。当数组元素在内存中是连续存储的,CPU可以更有效地缓存这些元素,从而减少内存访问的延迟。对于嵌入式系统来说尤其重要,因为嵌入式系统通常对性能有很高的要求,并且内存资源有限。
-
数组越界的风险:由于数组元素是连续存储的,因此如果访问了数组的有效范围之外的元素(即数组越界),就可能会覆盖内存中的其他数据,导致程序崩溃或数据损坏。在嵌入式系统中,这种错误可能会导致更严重的后果,因为嵌入式系统通常运行着关键任务,并且资源有限。
三、数组的初始化
3.1. 完全初始化
当希望数组的所有元素在定义时都具有特定的值时,可以使用完全初始化。在完全初始化中,需要为数组的每个元素提供一个初始值。
int arr[3] = {1, 2, 3};
arr[0]
被初始化为1,arr[1]
被初始化为2,arr[2]
被初始化为3。由于提供了数组的所有元素的初始值,因此这是一种完全初始化。
3.2. 部分初始化
有时,可能只希望初始化数组的一部分元素,而其他元素则保持未初始化状态。在C语言中,当部分初始化一个数组时,未指定的元素会自动被初始化为0(对于全局数组或静态数组)或者保持为不确定的值(对于局部数组,即函数内部定义的数组)。
int arr[5] = {1, 2};
arr[0]
被初始化为1,arr[1]
被初始化为2。对于全局数组或静态数组,arr[2]
、arr[3]
和arr[4]
会被自动初始化为0。然而,如果arr
是一个局部数组,这些未初始化的元素将包含不确定的值。
3.3. 不指定大小初始化
当初始化一个数组时,可以省略数组的大小。编译器会根据提供的初始值的数量自动确定数组的大小。
int arr[] = {1, 2, 3, 4};
编译器会自动将数组arr
的大小确定为4,因为它包含了4个初始值。这种初始化方式在不知道数组将包含多少个元素,但希望在定义时提供所有元素的值时非常有用。
四、使用数组
4.1. 访问数组元素
4.1.1. 通过索引访问数组元素
数组元素通过索引访问,索引从0开始。意味着第一个元素的索引是0,第二个元素的索引是1,依此类推。
int numbers[5] = {1, 2, 3, 4, 5};
int firstNumber = numbers[0]; // firstNumber 的值为 1
在嵌入式系统中,这种访问方式非常常见,比如读取传感器数据并存储在数组中,或者将控制命令发送到执行器,这些数据可能以数组的形式存在并进行处理。
4.1.2. 通过指针访问数组元素
数组名在大多数情况下会被解释为指向数组首元素的指针。因此,可以使用指针来访问数组元素。
int arr[5] = {10, 20, 30, 40, 50};
int *p = arr; // p现在指向arr的首元素,即arr[0]
int secondElement = p[1]; // secondElement的值为20,因为p[1]等同于arr[1]
指针访问在处理动态内存分配或在函数间传递数组时特别有用。例如,在嵌入式系统中,可能有一个函数需要处理来自传感器的数据数组。可以将这个数组作为指针参数传递给函数,这样函数就可以直接访问和修改数组元素
4.2. 遍历数组
在嵌入式系统中,遍历数组是一项基本且常见的任务。通过遍历数组,可以对每个元素执行特定的操作,例如计算总和、查找最大值或最小值、打印数组内容等。遍历数组通常通过循环来实现,无论是for
循环、while
循环还是do-while
循环。
以下是遍历数组的基本步骤:
-
初始化循环变量:通常,会使用一个整数变量作为循环变量(也称为索引或计数器),并将其初始化为0(因为数组索引从0开始)。
-
设置循环条件:循环将继续执行,直到循环变量的值达到或超过数组的大小。
-
更新循环变量:在每次循环迭代结束时,增加循环变量的值(通常是加1)。
-
访问数组元素:在循环体内,使用循环变量作为索引来访问数组元素,并对该元素执行所需的操作。
代码示例:以下是一个使用for
循环遍历数组并计算总和的示例:
#include <stdio.h>int main() {int numbers[5] = {1, 2, 3, 4, 5};int sum = 0;// 使用for循环遍历数组for (int i = 0; i < 5; i++) {sum += numbers[i]; // 将当前元素的值加到总和中}// 打印总和printf("The sum of the array elements is: %d\n", sum);return 0;
}
查找最大值的示例:以下是另一个使用for
循环遍历数组并查找最大值的示例:假设数组的第一个元素是最大值,并使用for
循环遍历数组的其余部分。如果找到比当前最大值更大的元素,就更新最大值。
4.3. 数组作为函数参数
在嵌入式C语言中,当数组作为函数参数时,实际上传递的是数组的首地址(即一个指向数组首元素的指针)。由于数组名在大多数情况下会被解释为指向其首元素的指针,因此在函数声明和定义中,数组参数通常被声明为指针类型。同时,由于函数本身并不接收数组的大小信息,通常需要额外传递一个表示数组大小的参数。
以下代码示例,展示了如何将数组作为函数参数传递,并在函数内部处理数组:
#include <stdio.h>// 函数声明,接受一个整数指针和数组大小作为参数
void processArray(int *arr, int size);int main() {// 定义一个整数数组int numbers[] = {1, 2, 3, 4, 5};// 获取数组的大小(元素个数)int size = sizeof(numbers) / sizeof(numbers[0]);// 调用函数,传递数组和大小processArray(numbers, size);return 0;
}// 函数定义,遍历数组并打印每个元素
void processArray(int *arr, int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]); // 使用指针访问数组元素}printf("\n");
}
需要注意的是,虽然在这个例子中我们使用了数组名numbers
作为函数参数,但在函数声明和定义中,将参数类型声明为指针int *
。这是因为当数组名作为函数参数时,它会自动退化为指向其首元素的指针。
此外,由于函数本身不接收数组的大小信息,因此必须手动传递一个表示数组大小的参数。通常是通过计算数组的总大小除以单个元素的大小来得到的(如sizeof(numbers) / sizeof(numbers[0])
所示)。这样做可以确保在函数内部能够正确地处理数组中的所有元素。
五、应用场景
5.1. 数据采集与存储
在嵌入式系统中,可能需要定期从传感器采集数据,并将这些数据存储在一个数组中,以便后续处理。以下是一个简单的例子,模拟从温度传感器采集数据并计算平均值:
#include <stdio.h>#define NUM_SAMPLES 10int main() {int temperatures[NUM_SAMPLES]; // 存储温度数据的数组int sum = 0;// 模拟采集数据for (int i = 0; i < NUM_SAMPLES; i++) {// 在实际应用中,这里应该是从传感器读取数据的代码temperatures[i] = (i + 1) * 10; // 假设温度数据是递增的,仅作为示例sum += temperatures[i];}// 计算平均值float average = sum / (float)NUM_SAMPLES;printf("Average temperature: %.2f\n", average);return 0;
}
5.2. 数据缓冲
在串口通信中,接收到的数据可能需要先存储在一个缓冲数组中,然后再进行解析。以下是一个简单的例子,模拟串口接收数据并存储在数组中:
#include <stdio.h>
#include <string.h>#define BUFFER_SIZE 100int main() {char buffer[BUFFER_SIZE]; // 存储接收数据的数组int index = 0;// 模拟接收到的数据char *receivedData = "Hello, Embedded World!";// 将数据复制到缓冲区中(在实际应用中,通常是由串口中断处理函数完成的)while (index < BUFFER_SIZE - 1 && receivedData[index] != '\0') {buffer[index++] = receivedData[index];}buffer[index] = '\0'; // 确保字符串以空字符结尾// 解析并打印接收到的数据printf("Received data: %s\n", buffer);return 0;
}
5.3. 查找与排序
以下是一个使用冒泡排序算法对整数数组进行排序,并查找特定元素的例子:
#include <stdio.h>#define ARRAY_SIZE 10// 冒泡排序函数
void bubbleSort(int arr[], int size) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}// 线性查找函数
int linearSearch(int arr[], int size, int target) {for (int i = 0; i < size; i++) {if (arr[i] == target) {return i; // 返回找到的元素的索引}}return -1; // 如果未找到,则返回-1
}int main() {int numbers[ARRAY_SIZE] = {5, 3, 8, 6, 2, 7, 4, 1, 9, 0};int target = 6;// 对数组进行排序bubbleSort(numbers, ARRAY_SIZE);// 打印排序后的数组printf("Sorted array: ");for (int i = 0; i < ARRAY_SIZE; i++) {printf("%d ", numbers[i]);}printf("\n");// 查找目标元素int index = linearSearch(numbers, ARRAY_SIZE, target);if (index != -1) {printf("Element %d found at index %d.\n", target, index);} else {printf("Element %d not found.\n", target);}return 0;
}
这些应用场景在嵌入式系统中非常常见,并且数组是处理这些数据的有效工具。
六、注意事项
使用一维数组时需要注意以下几个关键点,以确保代码的健壮性、效率和可靠性。
6.1. 内存管理
- 嵌入式系统通常具有有限的内存资源。因此,在声明数组时,必须仔细考虑数组的大小,以避免内存溢出。
- 使用静态分配内存(即在编译时确定大小)时,要确保分配的大小不会超过可用的内存空间。
- 如果需要动态分配内存(例如,使用
malloc
函数),确保在不再需要时释放内存,以防止内存泄漏。
6.2. 数组边界
- 访问数组元素时,必须确保索引在有效范围内(即0到数组大小减1之间)。超出这个范围的访问将导致未定义行为,可能引发程序崩溃或数据损坏。
- 在循环中遍历数组时,要确保循环条件正确设置,以避免数组越界。
6.3. 初始化
- 未初始化的数组可能包含垃圾值。在使用数组之前,最好显式地初始化它,以确保所有元素都具有已知的值。
- 对于全局或静态数组,C语言会自动将其初始化为0(对于数值类型)。但是,对于局部数组(在函数内部声明的数组),不会自动初始化,它们的初始值是未定义的。
6.4. 类型匹配
- 当将数组传递给函数时,要确保函数参数的类型与数组元素的类型相匹配。如果类型不匹配,可能会导致数据解释错误或数据丢失。
- 在函数内部处理数组时,也要确保使用正确的类型来访问数组元素。
6.5. 指针与数组
- 在函数参数中使用数组时,实际上传递的是指向数组首元素的指针。因此,在函数内部无法直接获取数组的大小。通常,需要额外传递一个表示数组大小的参数。
- 要小心处理指针运算,确保它们不会导致数组越界或访问无效的内存区域。
6.6. 性能考虑
- 在嵌入式系统中,数组访问的速度通常很快,但仍然要注意数组的大小和访问模式对性能的影响。例如,大数组可能会增加缓存未命中的可能性,从而降低性能。
- 在处理大量数据时,考虑使用更高效的数据结构或算法来优化性能。
6.7. 代码可读性
- 为了提高代码的可读性和可维护性,建议使用有意义的变量名和注释来清晰地表达数组的用途和内容。
- 将数组的大小定义为常量,并在多个地方使用这个常量,而不是硬编码的数字,有助于减少错误并提高代码的一致性。
综上所述,通过理解这些基本概念和注意事项,您以在嵌入式系统开发中更有效地使用一维数组来存储和处理数据。
相关文章:
嵌入式 C 语言:一维数组
目录 一、定义 二、内存布局 三、数组的初始化 3.1. 完全初始化 3.2. 部分初始化 3.3. 不指定大小初始化 四、使用数组 4.1. 访问数组元素 4.1.1. 通过索引访问数组元素 4.1.2. 通过指针访问数组元素 4.2. 遍历数组 4.3. 数组作为函数参数 五、应用场景 5.1. 数据…...
NineData云原生智能数据管理平台新功能发布|2024年12月版
本月发布 7 项更新,其中重点发布 2 项、功能优化 5 项。 重点发布 数据库 Devops - Oracle 非表对象支持可视化创建与管理 Oracle 非表对象,包括视图(View)、包(Package)、存储过程(Procedur…...
iOS - 自旋锁
在 Objective-C 运行时中大量使用自旋锁,主要有以下几个原因: 1. 性能考虑 上下文切换成本 // 自旋锁实现 static ALWAYS_INLINE void OSSpinLockLock(volatile OSSpinLock *lock) {do {while (lock->value ! 0) {__asm__ volatile ("pause&q…...
域名备案页面模板
域名备案模板,首页底下正中央位置需要有备案号。 主要是给不太擅长于前端样式的人提供一个备案模板,直接把这个H5放到nginx的index.html就可以访问了 <html><body><div class"login-container"><h2>登录</h2>&…...
【socketioxide和axum集成-实现websocket实时通信-Rust点滴】
socketioxide的axum集成 启动socketio依靠examle里的layer一. 使用可变State依靠axum里的example二.提取client,IP1. 非代理,tcp,socket对方地址2.代理情况下socket.req_parts. 三. axum的handle中使用emit发送消息.1. io,存入State解决.2.把io存入初始设定作为唯一单例3.http-…...
计算机网络(第8版)第3章--PPP课后习题
【3-09】 一 个PPP 帧的数据部分(用十六进制写出)是7 D 5EFE 277D 5D7D 5D657D 5E。 试问真正的数据是什么(用十六进制写出)? 解答:把由转义符7D开始的2字节序列用下画线标出: 7D 5E FE 27 7D 5D 7D 5D 65 7D 5E 7D 5E应当还原成为7E。 7D5D 应…...
通过Android Studio修改第三方jar包并重新生成jar包
最近接手了来自公司其他同事的一个Unity项目,里面有一个封装的jar包要改动一下,无奈关于这个jar包的原工程文件丢失了,于是自己动手来修改下jar包,并做下记录。 一、导入第三方jar包 1、新建项目EditJarDemo(项目名随便取) 2、新建libs文件夹,把你要修改的third.jar 复制…...
Rabbitmq 业务异常与未手动确认场景及解决方案
消费端消费异常,业务异常 与 未手动确认是不是一个场景,因为执行完业务逻辑,再确认。解决方案就一个,就是重试一定次数,然后加入死信队列。还有就是消费重新放入队列,然后重新投递给其他消费者,…...
3D机器视觉的类型、应用和未来趋势
3D相机正在推动机器视觉市场的增长。很多制造企业开始转向自动化3D料箱拣选,专注于使用3D视觉和人工智能等先进技术来简化操作并减少开支。 预计3D相机将在未来五年内推动全球机器视觉市场,这得益于移动机器人和机器人拣选的强劲增长。到 2028 年&#…...
LabVIEW在反馈控制时如何解决带约束的控制问题
在LabVIEW中,解决带约束的反馈控制问题通常需要使用先进的控制算法或特定的方法来满足约束条件,同时保证控制系统的性能和稳定性。以下是解决这类问题的一些常用方法和步骤: 1. 定义控制问题及约束条件 确定被控对象的动态特性(…...
PHP 在 2025 年的现状与展望
PHP 在 2025 年依然强劲,继续为超过 77% 使用已知服务器端编程语言的网站提供动力。这并非仅仅依靠遗留代码,像 WordPress、Shopify 和 Laravel 这样的主流平台持续推动 PHP 的发展,使其保持着 актуальность 并不断进化。 为什么…...
QT c++ 自定义按钮类 加载图片 美化按钮
如果你有需要利用图片美化按钮的情况,本文能帮助你。 鼠标左键按下按钮和松开,按钮显示不同的图片。 1.按钮类 //因为此类比较简单,1个头文件搞定,没有cpp文件 #ifndef CUSTOMBUTTON_H #define CUSTOMBUTTON_H #include <Q…...
夯实前端基础之HTML篇
知识点概览 HTML部分 1. DOM和BOM有什么区别? DOM(Document Object Model) 当网页被加载时,浏览器会创建页面的对象文档模型,HTML DOM 模型被结构化为对象树 用途: 主要用于网页内容的动态修改和交互&…...
pytest 参数介绍
命令行参数描述常见使用案例-v / --verbose显示每个测试用例的详细信息,包括测试名称和状态pytest -v-s / --captureno禁用输出捕获,允许 print() 输出显示pytest -s-q / --quiet安静模式,减少输出,仅显示每个测试的通过/失败结果…...
蓝桥杯训练
1对于一个字母矩阵,我们称矩阵中的一个递增序列是指在矩阵中找到两个字母,它们在同一行,同一列,或者在同一 45 度的斜线上,这两个字母从左向右看、或者从上向下看是递增的。 例如,如下矩阵中 LANN QIAO有…...
maven的简单介绍
目录 1、maven简介2、maven 的主要特点3、maven的下载与安装4、修改配置文件5、私服(拓展) 1、maven简介 Maven 是一个广泛使用的项目管理和构建工具,主要应用于 Java 项目。Maven 由 Apache 软件基金会开发和维护,它提供了一种简洁且一致的方法来构建、…...
超完整Docker学习记录,Docker常用命令详解
前言 关于国内拉取不到docker镜像的问题,可以利用Github Action将需要的镜像转存到阿里云私有仓库,然后再通过阿里云私有仓库去拉取就可以了。 参考项目地址:使用Github Action将国外的Docker镜像转存到阿里云私有仓库 一、Docker简介 Do…...
Kafka优势剖析-消费者组、并行消费
目录 1. 消费者组(Consumer Group) 1.1 什么是消费者组? 1.2 消费者组的工作原理 1.3 消费者组的优势 2. 并行消费(Parallel Consumption) 2.1 什么是并行消费? 2.2 并行消费的工作原理 2.3 并行消…...
MATLAB语言的多线程编程
MATLAB语言的多线程编程 引言 随着计算机技术的不断发展,尤其是在大数据和高性能计算领域,多线程编程逐渐成为一种重要的编程范式。MATLAB作为一种广泛应用于科学计算和工程模拟的高级编程语言,其强大的数学计算功能和丰富的工具箱…...
强化学习入门
RL学习路径 理解DQN原理 理解 标准版的策略梯度算法(Vanilla Policy Gradient) 模仿学习实践 Actor-Critic原理 从大模型机器人到imitation Learning与diffusion policy、ACT(Action Chunking with Transformers)的关系 大模型与机器人 tmp: 强化学习中的优势函数&#…...
Unity 2d描边基于SpriteRender,高性能的描边解决方案
目标 以Unity默认渲染管线为例,打造不需要图片内边距,描边平滑,高性能的描边解决方案 前言 在2d游戏中经常需要给2d对象添加描边,来突出强调2d对象 当你去网上查找2d描边shader,移植到项目里面,大概率会…...
2025第2周 | JavaScript中的Symbol
目录 1. Symbol是个什么东东?1.1 语法 2. 为什么需要Symbol?3. 怎么使用Symbol?3.1 定义对象字面量3.2 新增对象属性3.3 使用 Object.defineProperty方式3.4 遍历 4. 静态方法4.1 Symbol.for(key)4.2 Symbol.keyFor(symbol) 2025,做想做的事࿰…...
Unity学习之UGUI进阶
一、事件监听接口 1、作用 用于实现类型长按、双击、拖拽等基础控件无法实现的功能 所有控件都能够添加更多的事件监听来处理对应的逻辑 2、事件监听接口类型 (1)常用事件接口 (2)不常用事件接口 3、使用事件监听接口 &#…...
IT面试求职系列主题-Jenkins
想成功求职,必要的IT技能一样不能少,先说说Jenkins的必会知识吧。 1) 什么是Jenkins Jenkins 是一个用 Java 编写的开源持续集成工具。它跟踪版本控制系统,并在发生更改时启动和监视构建系统。 2)Maven、Ant和Jenkins有什么区别…...
Allure 集成 pytest
Allure 是一个强大的测试报告工具,与 pytest 集成可以生成详细的测试报告,包括测试步骤、测试数据、截图、错误堆栈等。 1. 安装 Allure 和相关依赖 安装 pytest-allure-adaptor 插件: pip install allure-pytest确保本地已安装 Allure 工具。…...
Redis高频知识点
Redis 目录 1 Redis是AP的还是CP的?2 介绍一下Redis的集群方案?3 什么是Redis的数据分片?4 Redis为什么这么快?5 Redis 的事务机制是怎样的?7 Redis的持久化机制是怎样的?8 Redis 的过期策略是怎么样的&a…...
【电子通识】PWM驱动让有刷直流电机恒流工作
电机的典型驱动方法包括电压驱动、电流驱动以及PWM驱动。本文将介绍采用PWM驱动方式的恒流工作。 首先介绍的是什么是PWM驱动的电机恒流工作,其次是PWM驱动电机恒流工作时电路的工作原理。 PWM驱动 当以恒定的电流驱动电机时,电机会怎样工作呢࿱…...
PyMysql 02|(包含项目实战)数据库工具类封装
目录 七、数据库工具类封装 1、封装的目的 2、设计数据库工具类 3、实现类方法 1️⃣获取、关闭连接 2️⃣查询一条记录 3️⃣增删改数据 4️⃣完整封装代码实现 七、数据库工具类封装 1、封装的目的 将常用的数据库操作,封装到一个方法。 后续再操作数据…...
Pixel 6a手机提示无法连接移动网络,打电话失败!
1、开启VoLTE 2、如果没有,下载shizuku和PixelIMS应用。 shizuke Releases RikkaApps/Shizuku GitHub PixellMS Release v1.2.8 kyujin-cho/pixel-volte-patch GitHub 3、安装shizuke启动,开通root可以直接点击下面的启动,如果没有就…...
ubuntu20.04 在线安装postgresql 扩展postgis
基础配置 /etc/apt/sources.list # 添加pg官方基础配置deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main# 添加ubuntu官方依赖(防止下载依赖错误)deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse de…...
fitz获取pdf内容
1.获取pdf单页,及所有内容 import fitz # PyMuPDF# 打开 PDF 文件 pdf_path r"/data2/ljsang/0106/0725_Self-organization-of-plasticity-and-specialization-in-a-primi_2022_Cell-Syst.pdfπσΣ╕╖σσ║Θ║∩╝Φ╛τ▒│σ¡τ╛π.pdf" d…...
LabVIEW软件Bug的定义与修改
在LabVIEW软件开发过程中,bug(程序错误或缺陷)指的是程序中导致不符合预期行为的任何问题。Bug可能是由于编码错误、逻辑漏洞、硬件兼容性问题、系统资源限制等因素引起的。它可能会导致程序崩溃、功能无法正常执行或输出结果不符合预期。理解…...
Vue3(elementPlus) el-table替换/隐藏行箭头,点击整行展开
element文档链接: https://element-plus.org/zh-CN/component/form.html 一、el-table表格行展开关闭箭头替换成加减号 注:Vue3在样式中修改箭头图标无效,可能我设置不对,欢迎各位来交流指导 转变思路:隐藏箭头&…...
HTML 音频(Audio)
HTML 音频(Audio) HTML5 引入了新的音频标签 <audio>,使得在网页上嵌入音频文件变得更加简单。在此之前,播放音频通常需要依赖于第三方插件,如 Flash。但随着 HTML5 的普及,浏览器原生支持音频播放,极大地提升了用户体验和网页性能。 基本用法 要使用 HTML5 的音…...
linux音视频采集技术: v4l2
简介 在 Linux 系统中,视频设备的支持和管理离不开 V4L2(Video for Linux 2)。作为 Linux 内核的一部分,V4L2 提供了一套统一的接口,允许开发者与视频设备(如摄像头、视频采集卡等)进行交互。无…...
基于高斯混合模型的数据分析及其延伸应用(具体代码分析)
一、代码分析 (一)清除工作区和命令行窗口 clear; clc;clear;:该命令用于清除 MATLAB 工作区中的所有变量,确保代码运行环境的清洁,避免之前遗留的变量对当前代码运行产生干扰。例如,如果之前运行的代码中…...
内网基础-防火墙-隧道技术
内网对抗-网络通讯篇&防火墙组策略&入站和出站规则&单层双层&C2正反向上线 关闭第一个防火墙: 第一个上线就走反向或者正向 第二个上线走反向(第二个防火墙阻止入站) 关闭第二个防火墙: 第一个上线就走反向&a…...
123.【C语言】数据结构之快速排序挖坑法和前后指针法
目录 1.挖坑法 执行流程 代码 运行结果 可读性好的代码 2.前后指针法(双指针法) 执行流程 单趟排序代码 将单趟排序代码改造后 写法1 简洁的写法 3.思考题 1.挖坑法 执行流程 "挖坑法"顾名思义:要有坑位,一开始将关键值放入临时变量key中,在数组中形成…...
【沉默的羔羊心理学】汉尼拔的“移情”游戏:操纵与理解的艺术,精神分析学视角下的角色互动
终极解读《沉默的羔羊》:弗洛伊德精神分析学视角下的深层剖析 关键词 沉默的羔羊弗洛伊德精神分析学角色心理意识与潜意识性别与身份 弗洛伊德精神分析学简介 弗洛伊德的精神分析学是心理学的一个重要分支,主要关注人类行为背后的无意识动机和冲突。…...
Bytebase 3.0.1 - 可配置在 SQL 编辑器执行 DDL/DML
🚀 新功能 新增环境策略,允许在 SQL 编辑器内直接执行 DDL/DML 语句。 支持为 BigQuery 数据脱敏。 在项目下新增数据访问控制及脱敏管理页面。 在数据库页面,支持回滚到变更历史的某个版本。 🔔 兼容性变更 禁止工单创建…...
从零手写线性回归模型:PyTorch 实现深度学习入门教程
系列文章目录 01-PyTorch新手必看:张量是什么?5 分钟教你快速创建张量! 02-张量运算真简单!PyTorch 数值计算操作完全指南 03-Numpy 还是 PyTorch?张量与 Numpy 的神奇转换技巧 04-揭秘数据处理神器:PyTor…...
git使用指南-实践-搭建git私服
一.创建git私服的核心基础 所谓的git私服,其实就是在一个服务器上创建一个个的git仓库,并且这些仓库允许其在一个网络上被其他用户访问。 创建一个最素的git私服:随便找一台linux服务器,这里假设其ip为192.168.0.6,使…...
Node.js JXcore 打包教程
Node.js JXcore 打包教程 介绍 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它允许开发者使用 JavaScript 编写服务器端和网络应用程序。JXcore 是一个流行的 Node.js 发行版,它支持将 Node.js 应用程序打包成单一的可执行文件,使得部署和分发变得更加容易…...
Xshell 8 最新中文免安装绿色版
前言 Xshell8是一个非常受欢迎的远程连接管理软件,它的界面简单易懂,用起来特别方便。能支持好多种连接方式,比如SSH1、SSH2、SFTP、TELNET等等,还有串行协议和其他一些高级功能,基本上你想连什么都能满足。而且&…...
结构型模式4.装饰器模式
结构型模式 适配器模式(Adapter Pattern)桥接模式(Bridge Pattern)组合模式(Composite Pattern)装饰器模式(Decorator Pattern)外观模式(Facade Pattern)享元…...
备考蓝桥杯:顺序表详解(静态顺序表,vector用法)
目录 1.顺序表的概念 2.静态顺序表的实现 总代码 3.stl库动态顺序表vector 测试代码 1.顺序表的概念 要理解顺序表,我们要先了解一下什么是线性表 线性表是n个具有相同特征的数据元素的序列 这就是一个线性表 a1是表头 a4是表尾 a2是a3的前驱 a3是a2的后继 空…...
使用uniapp 微信小程序一些好用的插件分享
总结一下自己在开发中遇见的一问题,通过引入组件可以快速的解决 1.zxz-uni-data-select 下拉框选择器(添加下拉框检索,多选功能,多选搜索功能,自定义 下拉框插件,使用这个的原因是因为 uniui uview 组件库下拉框太…...
当遇到 502 错误(Bad Gateway)怎么办
很多安装雷池社区版的时候,配置完成,访问的时候可能会遇到当前问题,如何解决呢? 客户端,浏览器排查 1.刷新页面和清除缓存 首先尝试刷新页面,因为有时候 502 错误可能是由于网络临时波动导致服务器无法连…...
R语言安装教程与常见问题
生物信息基础入门笔记 R语言安装教程与常见问题 今天和大家聊一个非常基础但是很重要的技术问题——如何在不同操作系统上安装R语言?作为生物信息学数据分析的神兵利器,R语言的安装可谓是入门第一步,学术打工人的必备技能。今天分享在Windows…...
windows 下基于docker 部署 guacamole
背景 Apache Guacamole 是一种无客户端或插件的远程桌面网关。它支持多个标准协议,如 VNC、RDP 和 SSH等。记录下部署过程。 步骤 1, 安装docker desktop choco install docker-desktop -y 注: 若windows 11还未安装wsl,则需要…...