重生之我在异世界学编程之C语言:深入结构体篇(上)
大家好,这里是小编的博客频道
小编的博客:就爱学编程
很高兴在
CSDN
这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!
本文目录
- 引言
- 正文
- 《1》 结构体的两种声明
- 一、结构体的定义
- 二、全局结构体变量
- 三、局部结构体变量
- 四、匿名结构体与全局/局部变量
- 《2》typedef对结构体类型进行重命名
- 一、基本语法
- 二、作用与优势
- 三、示例说明
- 《3》 结构体的初始化和访问
- 1. **声明时初始化**
- 2. **后续初始化**
- 3.访问结构体成员
- 《4》 结构体的内存对齐和修改默认对其数的方法
- 一、结构体与内存对齐的基本概念
- 二、结构体内存对齐的规则
- 三、为什么存在内存对齐
- 四、如何修改默认对齐数
- 1.使用#pragma pack
- 2.使用__attribute__((packed))
- 《5》结构体传参
- 一、通过值传递结构体
- 二、通过指针传递结构体
- 三、返回结构体
- 3.1 返回结构体值
- 3.2 返回结构体指针
- 快乐的时光总是短暂,咱们下篇博文再见啦!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!
引言
在C语言中,结构体(struct)是一种用户自定义的数据类型,它允许将多个不同类型的数据项组合成一个单一的类型。结构体是编程中组织相关数据的有效方式,尤其在处理复杂数据时显得尤为重要。以下是对C语言结构体基础知识的详细介绍,一起来看看吧!!
那接下来就让我们开始遨游在知识的海洋!
正文
在C语言中,当结构体被定义后,可以在全局作用域或局部作用域(如函数内部)中声明其变量。这些结构体变量的作用域和生命周期会根据它们是在全局还是局部声明的而有所不同。下面小编将详细解释全局变量、局部变量以及匿名声明与结构体之间的关系,特别是在主函数内的区别。
《1》 结构体的两种声明
一、结构体的定义
首先,我们需要定义一个结构体。例如:
struct MyStruct {int a;float b;
};
这里我们定义了一个名为MyStruct
的结构体,它包含两个成员:一个整型a
和一个浮点型b
。
二、全局结构体变量
如果在所有函数之外声明一个结构体变量,那么它就是全局的。全局结构体变量在整个程序的生命周期内都有效,并且可以被任何函数访问。例如:
// 全局作用域中声明结构体变量
struct MyStruct globalVar;int main() {// 可以在main函数中访问globalVarglobalVar.a = 10;globalVar.b = 3.14;// ... 其他代码
}
在这个例子中,globalVar
是一个全局结构体变量,它在整个程序中都是可见的,包括在main
函数内。
三、局部结构体变量
如果在某个函数内部声明一个结构体变量,那么它就是局部的。局部结构体变量只在声明它的函数内部有效,一旦函数执行完毕,该变量就会被销毁。例如:
int main() {// 局部作用域中声明结构体变量struct MyStruct localVar;localVar.a = 20;localVar.b = 6.28;// localVar只能在main函数内部使用// ... 其他代码
}
在这个例子中,localVar
是一个局部结构体变量,它只能在main
函数内部被访问和使用。
四、匿名结构体与全局/局部变量
在C语言中,还可以声明匿名结构体变量。匿名结构体是没有名称的结构体类型,通常用于只需要一个结构体实例的情况。匿名结构体变量的声明方式与全局或局部变量类似,只是没有给出结构体的名称。例如:
// 在全局作用域中声明匿名结构体变量
struct {int x;int y;
} globalAnonymousVar;int main() {// 在局部作用域中声明另一个匿名结构体变量(注意:这是另一个不同的类型)struct {int m;int n;} localAnonymousVar;globalAnonymousVar.x = 1;globalAnonymousVar.y = 2;localAnonymousVar.m = 3;localAnonymousVar.n = 4;// 注意:globalAnonymousVar和localAnonymousVar是不同类型的变量// 因此不能相互赋值或比较// ... 其他代码
}
在这个例子中,globalAnonymousVar
和localAnonymousVar
分别是全局和局部的匿名结构体变量。需要注意的是,由于它们是匿名的且定义不同,因此它们是两种完全不同的类型,不能相互赋值或比较。
- 全局结构体变量:在整个程序生命周期内有效,可以被任何函数访问。
- 局部结构体变量:只在声明它的函数内部有效,函数执行完毕后会被销毁。
- 匿名结构体变量:没有名称的结构体类型,通常用于单个实例的情况。全局和局部的匿名结构体变量是两种不同的类型。
希望以上内容能够帮助宝子们理解C语言中结构体与全局变量、局部变量以及匿名声明之间的关系。
typedef
是C语言中的一个关键字,它主要用于为数据类型定义新的名称(别名),这包括基本数据类型、引用类型以及自定义的数据类型。在结构体(struct)的使用中,typedef
的作用尤为显著,因为它可以简化结构体的声明和使用,提高代码的可读性和可维护性。以下是对typedef
对结构体进行重命名的详细介绍.
《2》typedef对结构体类型进行重命名
一、基本语法
typedef
的基本语法如下:
typedef 原有类型 新类型名;
当用于结构体时,可以这样写:
typedef struct {成员列表;
} 新类型名;
或者先定义结构体,再用typedef
为其命名:
struct 旧类型名 {成员列表;
};
typedef struct 旧类型名 新类型名;
二、作用与优势
- 简化声明:使用
typedef
可以为复杂的结构体类型定义一个简短且易于理解的新名字,从而简化变量的声明。例如,对于包含多个成员的结构体,直接使用其原始类型声明变量可能会显得冗长,而使用typedef
定义的新类型名则可以使声明更加简洁明了。
- 提高可读性:通过为结构体类型定义具有描述性的新名字,可以提高代码的可读性。这些新名字通常能够更直观地反映结构体的用途或内容,从而使代码更容易被理解和维护。
- 便于修改:如果需要在程序中更改结构体的定义,只需修改结构体本身的定义即可,而不必修改所有使用该结构体的变量声明。这是因为这些变量声明使用的是由
typedef
定义的新类型名,而不是结构体的原始类型名。因此,使用typedef
可以降低因修改结构体定义而导致的代码修改量。
三、示例说明
以下是一个使用
typedef
对结构体进行重命名的示例:
#include <stdio.h>// 使用typedef定义一个新的结构体类型Point3D
typedef struct {int x;int y;int z;
} Point3D;int main() {// 使用新类型名Point3D声明变量pPoint3D p = {1, 2, 3};// 打印变量p的成员值printf("x: %d, y: %d, z: %d
", p.x, p.y, p.z);return 0;
}
在这个示例中,我们首先使用
typedef
定义了一个新的结构体类型Point3D
,该结构体包含三个整型成员x
、y
和z
。然后,我们在main
函数中使用新类型名Point3D
声明了一个变量p
,并初始化了它的成员值。最后,我们打印了变量p
的成员值以验证其正确性。
注意:
- 在使用
typedef
对结构体进行重命名时,应确保新类型名的唯一性和描述性,以避免与其他类型名冲突并提高代码的可读性。
- 如果结构体中包含指向自身的指针成员(即自引用),则需要特别注意
typedef
的使用方式。在这种情况下,可以先定义结构体的匿名类型,然后使用typedef
为该类型命名;或者在定义结构体的同时直接使用typedef
为其命名,并在结构体内部使用struct
关键字加上新类型名来声明指向自身的指针成员。
综上所述:
typedef
是C语言中一个非常有用的关键字,它可以极大地简化结构体的声明和使用,提高代码的可读性和可维护性。
当然!在C语言中,结构体(struct)是一种用户自定义的数据类型,允许将不同类型的数据组合成一个单一的类型。链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。通过结构体,我们可以方便地实现链表。
下面是一篇关于如何使用C语言的结构体来实现链表的详细介绍。
《3》 结构体的初始化和访问
1. 声明时初始化
我们可以在声明结构体变量的同时对其进行初始化。这通常使用花括号{}
来指定每个成员的初值。
struct Student student1 = {"Alice", 20, 95.5};
在这个例子中,我们创建了一个名为student1
的Student
结构体变量,并在声明时将其成员初始化为"Alice"
、20
和95.5
。
2. 后续初始化
如果我们在声明时没有初始化结构体变量,那么可以在后续的代码中逐个设置其成员的值。
struct Student student2;
strcpy(student2.name, "Bob"); // 使用strcpy函数复制字符串到字符数组
student2.age = 22;
student2.grade = 88.0;
注意:
- 对于字符数组类型的成员,我们不能直接赋值(如
student2.name = "Bob";
),因为这样会尝试将一个字符串常量的地址赋给字符数组,而不是将字符串内容复制到数组中。因此,我们使用strcpy
函数来复制字符串。
3.访问结构体成员
一旦我们有了结构体变量,就可以通过点运算符.
来访问其成员。以下是一些示例:
printf("Name: %s
", student1.name);
printf("Age: %d
", student1.age);
printf("Grade: %.2f
", student1.grade);
在这个例子中,我们使用点运算符.
来访问student1
的各个成员,并将它们打印到控制台上。
《4》 结构体的内存对齐和修改默认对其数的方法
以下是一篇关于结构体的内存对齐和修改默认对齐方法的详细介绍.
一、结构体与内存对齐的基本概念
在编程中,结构体(Structure)是一种可以存储不同类型数据项的复合数据类型。它是一种用户自定义的数据类型,用于封装一组相关联的不同类型的数据项。结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
内存对齐是指数据在内存中按照一定的规则进行排列,以提高内存访问的效率。对于结构体来说,内存对齐意味着其成员变量在内存中的地址需要满足特定的对齐要求。这种对齐通常是由编译器自动处理的,但程序员也可以通过特定指令进行修改。
二、结构体内存对齐的规则
- 结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。这个对齐数通常是编译器默认的一个对齐数与该成员大小的较小值。不同的编译器和平台可能有不同的默认对齐数。
- 结构体总大小为最大对齐数(结构体中每个成员变量都有一个对齐数,取其中最大的一个)的整数倍。这是为了确保结构体在内存中的布局是紧凑且高效的。
- 如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。
三、为什么存在内存对齐
内存对齐的存在主要有以下几个原因:
- 提高内存访问效率:在许多计算机架构中,内存的访问速度是有限的。如果数据在内存中的位置是随机的,那么CPU需要花费额外的时间来寻找数据,这被称为内存访问延迟。然而,如果数据按照特定的对齐规则进行存储,CPU的内存控制器就可以更有效地预取数据,从而减少内存访问延迟。
- 提高硬件效率:许多现代CPU都有专门为对齐数据而设计的内部机制。例如,一些CPU具有专门的对齐引擎,可以更快地处理对齐的数据。如果数据没有对齐,CPU可能需要进行多次访问内存才能获取到完整的数据,这会降低CPU的效率。
- 减少数据依赖:在某些情况下,如果数据没有对齐,可能会导致一些特定的CPU指令无法使用,从而增加了数据的依赖性。这可能会使得程序的并行度降低,从而影响程序的性能。
- 提高程序的稳定性:在某些情况下,不对齐的内存访问可能会导致硬件异常或者程序崩溃。因此,编程时进行内存对齐不仅可以提高程序的性能,还可以提高程序的稳定性和可维护性。
四、如何修改默认对齐数
在C语言中,可以使用#pragma pack
或__attribute__((packed))
来改变结构体的对齐方式以减少填充字节。以下是两种方法的示例:
1.使用#pragma pack
#include <stdio.h>
#include <stddef.h>// 将对齐设置为1字节
#pragma pack(push, 1)
typedef struct {char c1; // 1 byteint i; // 4 bytes, but aligned to 1 byte boundary herechar c2; // 1 byte
} S1;
#pragma pack(pop) // 恢复默认对齐设置int main() {printf("%zu
", sizeof(S1)); // 输出结果为6,因为没有额外的填充字节return 0;
}
在这个例子中,使用了#pragma pack(push, 1)
将当前的对齐设置保存在栈中,并设置新的对齐方式为1字节。这样,结构体S1
的成员就会紧密排列在一起,没有额外的填充字节。使用完之后,通过#pragma pack(pop)
恢复之前的对齐设置。
2.使用__attribute__((packed))
这种方法适用于GCC和一些兼容的编译器。它告诉编译器不要为结构体的成员进行任何额外的对齐填充。
#include <stdio.h>
#include <stddef.h>typedef struct __attribute__((packed)) {char c1; // 1 byteint i; // 4 bytes, but packed tightly with no paddingchar c2; // 1 byte
} S2;int main() {printf("%zu
", sizeof(S2)); // 输出结果为6,同样没有额外的填充字节return 0;
}
需要注意的是:
- 虽然这两种方法可以减少结构体的总大小,但它们可能会降低数据访问的效率。因为未对齐的数据访问可能需要更多的内存操作,这在某些平台上可能会有较大的性能影响。
结构体的内存对齐是提高内存访问效率和程序稳定性的重要手段。了解并掌握结构体内存对齐的规则和修改默认对齐数的方法对于优化程序性能和资源利用具有重要意义。在实际编程中,应根据具体需求和平台特性选择合适的对齐方式和策略。
《5》结构体传参
一、通过值传递结构体
最简单的方式是通过值传递结构体到函数中。这意味着函数会接收到结构体的一个副本,对副本的任何修改都不会影响原始结构体。
#include <stdio.h>
#include <string.h>struct Person {char name[50];int age;float height;
};void printPerson(struct Person p) {printf("Name: %s
", p.name);printf("Age: %d
", p.age);printf("Height: %.2f
", p.height);
}int main() {struct Person person1 = {"Alice", 30, 5.7};printPerson(person1); // 通过值传递return 0;
}
缺点:
- 如果结构体很大,通过值传递会导致大量的内存复制操作,从而降低程序效率。
二、通过指针传递结构体
更常见且高效的方法是通过指针传递结构体。这样,函数接收的是指向结构体的指针,可以直接访问和修改原始数据。
#include <stdio.h>
#include <string.h>struct Person {char name[50];int age;float height;
};void printPerson(struct Person *p) {printf("Name: %s
", p->name);printf("Age: %d
", p->age);printf("Height: %.2f
", p->height);
}void modifyPerson(struct Person *p) {strcpy(p->name, "Bob");p->age = 25;p->height = 6.0;
}int main() {struct Person person1 = {"Alice", 30, 5.7};printPerson(&person1); // 通过指针传递modifyPerson(&person1); // 修改结构体内容printPerson(&person1); // 再次打印以查看修改结果return 0;
}
优点:
- 避免了大结构体的复制开销。
- 可以直接修改原始结构体中的数据。
在某些情况下,你可能希望从函数中返回一个结构体。这同样可以通过值和指针两种方式来实现。
三、返回结构体
3.1 返回结构体值
#include <stdio.h>struct Point {int x;int y;
};struct Point createPoint(int x, int y) {struct Point p;p.x = x;p.y = y;return p;
}int main() {struct Point p1 = createPoint(10, 20);printf("Point created: (%d, %d)
", p1.x, p1.y);return 0;
}
对于小型结构体,这种方式是可行的,但对于大型结构体,返回值可能会导致性能问题,因为涉及到结构体的复制。
3.2 返回结构体指针
#include <stdio.h>
#include <stdlib.h>struct Point {int x;int y;
};struct Point* createPoint(int x, int y) {struct Point *p = (struct Point*)malloc(sizeof(struct Point));if (p != NULL) {p->x = x;p->y = y;}return p;
}int main() {struct Point *p1 = createPoint(10, 20);if (p1 != NULL) {printf("Point created: (%d, %d)
", p1->x, p1->y);free(p1); // 不要忘记释放动态分配的内存}return 0;
}
这种方法适用于大型结构体或需要在函数外部持续使用结构体的情况,但需要注意内存管理,确保在使用完毕后释放动态分配的内存。
- 通过值传递:简单直观,但不适合大型结构体,因为会有较大的内存开销。
- 通过指针传递:高效且灵活,可以直接修改原始数据,是推荐的方法。
- 返回结构体:小型结构体可以通过值返回,大型结构体建议通过指针返回并注意内存管理。
理解并掌握这些结构体传参方式,将有助于宝子们编写更高效、灵活的C语言程序。
快乐的时光总是短暂,咱们下篇博文再见啦!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!
相关文章:
重生之我在异世界学编程之C语言:深入结构体篇(上)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文《1》 结构体的两种声明一、结构…...
到达率和服务率在python中实现
到达率和服务率在python中实现 概念理解 到达率(Arrival Rate):是指顾客(或任务、事件等)到达服务系统的平均速率,通常用单位时间内到达的数量来表示。例如,在一个客服中心,每小时平均有10个客户来电咨询,这里的每小时10个客户就是到达率。服务率(Service Rate):是…...
重视猫艾滋:宠物健康的隐秘挑战
猫艾滋,全称为猫获得性免疫缺陷综合征(Feline Acquired Immunodeficiency Syndrome),是由猫免疫缺陷病毒(FIV)感染引起的一种严重危害猫类健康的疾病。虽然其名称与人类艾滋病相似,但猫艾滋仅在…...
使用长轮询解决某些场景的实时消息推送需求
需求来源 最近做一个需求实现在移动端通过按钮,远程控制大屏幕上展示的资源进行实时切换,可以展示一个大屏页面,可以展示一段视频,也可以展示一张图片。 解决思路 大屏幕上打开一个游览器,访问指定动态资源展示页面…...
uniapp-内部项目使用文档
uniapp-内部项目使用文档 目录 uniapp-内部项目使用文档阶段1自行实现内容:阶段1问题记录: 阶段2自行实现内容: 阶段3 APP项目介绍及规范阶段4 公共组件方法UseList 列表页面HooksListItem 列表项uni-load-more 列表加载更多组件CardTitle 列…...
linux搭建NFS服务和autofs自动挂载NFS
文章目录 1、nfs服务1、nfs原理2、RPC和NFS通讯原理3、RPC和NFS流程4、NFS工作流程5、服务端搭建6、客户端搭建7、autofs自动挂载 1、nfs服务 1、nfs原理 是一个NAS的存储,通过网络来进行文件的共享,表现出来的形式就是一个文件夹 可以支持多个linux挂…...
springboot415社区网格化管理平台的构建-(论文+源码)_kaic
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本社区网格化管理平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…...
ubuntu下open-webui + ollama本地大模型部署
文章目录 nvidia gpu驱动安装 安装卸载 ollama 部署 添加docker秘钥docker配置添加国内镜像源ollama安装 从源拉取ollama镜像。启动一个ollama容器 通过ollama下载模型到本地检验本地模型 open-webui 部署 安装容器和镜像下载webui使用查看模型运行时内存、cpu、gpu占用 业余…...
自动化运维-配置Mysql、emqx、redis、nginx等通用性Linux日志分割工具 - logrotate
前言:logrotate 是一个在 Linux 系统中用于管理和轮转日志文件的工具。它的主要目的是帮助系统管理员自动执行日志文件的轮转、压缩、删除和邮件通知等任务,以防止日志文件占用过多的磁盘空间,同时保持日志文件的可管理性。 参考命令&#x…...
71、docker镜像制作上传/下载到阿里云
基本思想:简单学习一下如何制作镜像和上传下载到私有阿里云,然后构建一个gpu的训练/推理环境,以备后续使用 一、配置环境 ubuntu@ubuntu:~$ sudo apt-get install docker.ioubuntu@ubuntu:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS P…...
力扣--LCR 178.训练计划VI
题目 教学过程中,教练示范一次,学员跟做三次。该过程被混乱剪辑后,记录于数组 actions,其中 actions[i] 表示做出该动作的人员编号。请返回教练的编号。 示例 1: 输入:actions [5, 7, 5, 5] 输出&#…...
独孤思维:又有一个副业项目降价了
不要过早量出底牌,不然会变得低贱且廉价。 昨天在一个群里,看到有个博主,没有成交订单。 她把和用户的聊天对话发出来,我们大致看了下。 发现人家是有意向付费的。 但是这个博主过于心急,说今天加入可以优惠&#…...
【笔记】分布式任务调度平台XXL-JOB
这篇笔记主要记录以下内容: (1)第一次启动xxl-job的过程 (2)模块、文件、数据库(表和字段)的作用 (3)极少的源码解读(XxlJobConfig) 有点像实…...
Java基础总结上(Ref:JavaGuide)
基础概念与常识 Java语言有哪些特点,优点? 简单易学,是一门面向对象的语言,有封装继承多态三大特性,而且有多重防护机制保证安全性,例如权限修饰符,限制程序直接访问操作系统资源。通过JIT编译…...
嘉誉府5区共有产权看房记
特地工作日来看下嘉誉府5区的网红共有产权的房子,主要是冲着均价2.1万/平才来看。说实话从塘尾地铁步行到嘉誉府5区还挺需要时间的哈。可能以后需要电驴代步到地铁?确实楼盘现在是现楼,今年买明年住。鸿荣源确实很666哈。 今天来不需要排队&a…...
PostgreSQL函数中使用now()或current_timestamp的异同
在PostgreSQL函数中使用now()或current_timestamp可以获取当前的日期和时间。 now()函数返回当前的日期和时间,包括时区信息。它可以用于记录操作的时间戳或在查询中进行时间比较。 current_timestamp函数也返回当前的日期和时间,但不包括时区信息。它…...
跟李笑来学美式俚语(Most Common American Idioms): Part 56
Most Common American Idioms: Part 56 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记,自用。 Github仓库链接:https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来(或者clone到本地…...
类和对象一
目录 1.类的引入 2.类的定义 3.访问限定符 4.类的作用域 5.类对象模型 6.类的大小 1.类的引入 C语言结构体中只能定义变量,在C中,结构体不仅可以定义变量,也可以定义函数。 C兼容C语言,结构用法可以继续使用 同时sruct也升…...
两个数的和最小
两个数的和最小 C 代码C 代码Java 代码Python 代码 💐The Begin💐点点关注,收藏不迷路💐 给你n个整数,你可以从中任意取两个数a和b,问a加上b的和的绝对值最小可能是多少? 输入 有多组测试数据…...
Mac mini m4本地跑大模型(ollama + llama + ComfyUI + Stable Diffusion | flux)
安装chat大模型(不推荐,本地运行的大模型只能聊废话,不如网页版使用openAI等高效) 首先下载ollama的安装包 https://ollama.com/ 点击启动访问:http://localhost:11434 Ollama is running 代表已经运行起来了&#x…...
IoTDB AINode 报错,call inference 301: Error ocurred while executing inference
问题及现象 使用时序数据库 IoTDB 的 AINode 的 call inference 语句后报错: Msg: org.apache.iotdb.jdbc.IoTDBSOLException:301: Error ocurred while executing inference:[tuple object has no attribute inference]解决方法 可以替换 venv 里面的…...
Linux网络 UDP socket
背景知识 我们知道, IP 地址用来标识互联网中唯一的一台主机, port 用来标识该主机上唯一的一个网络进程,IPPort 就能表示互联网中唯一的一个进程。所以通信的时候,本质是两个互联网进程代表人来进行通信,{srcIp&…...
Day2——需求分析与设计
教师端签到应用软件的需求分析; 产品经理如何写好产品需求文档(附模板) 需求分析是软件开发过程中的关键步骤,它确保了开发的软件能够满足用户的需求。以下是进行需求分析的具体步骤: 1. 确定分析目标 明确教师端签到…...
aosp15上winscope离线html如何使用?
背景: aosp15上的如何使用Winscope前面已经有分享过相关的blog,这块其实和aosp14没啥大的差别,具体可以看如下2个文章: 手把手教你aosp14编译Winscope 安卓aosp15手机上如何离线获取winscope文件 文章中也说明在aosp15如果直接使…...
AttributeError: module numpy has no attribute int .报错解决
AttributeError: module numpy has no attribute int .报错解决方案_attributeerror: module numpy has no attribute i-CSDN博客 以上为参考教程,试了卸载再安装,不行,报错: Found existing installation: numpy 1.24.3 error: …...
python爬虫常用数据保存模板(Excel、CSV、mysql)——scrapy中常用数据提取方法(CSS、XPATH、正则)(23)
文章目录 1、常用数据保存模板2.1 保存为Excel格式2.2 保存为CSV格式2.3 保存至mysql数据库2、scrapy中常用数据提取方法2.1 XPath选择器2.2 CSS选择器2.3 正则表达式1、常用数据保存模板 2.1 保存为Excel格式 # 1、导入模块 from openpyxl import workbook# 2、创建一个exce…...
【面试题】简述rabbitmq的组织架构
[面试题]简述rabbitmq的组织架构 RabbitMQ 是一种流行的消息中间件,其架构设计围绕消息生产者, 消息消费者和消息中转(Broker)展开。以下是 RabbitMQ 的主要组织架构组件和它们之间的关系: 1. 核心组件 1.1 Producer࿰…...
C#-WPF 常见类型转换方法(持续更新)
目录 一、普通类型转换 1、Convert类 2、Parse(转String) 3、TryParse(转String) 4、ToString(转String) 5、int转double 6、String转DateTime 7、自定义类型的显示/隐式转换 二、byte[]转ImageSource 方法一 方法二 一、普通类型转换 1、Convert类 提供了一种安全…...
c基础加堆练习题
1】思维导图: 2】在堆区空间连续申请5个int类型大小空间,用来存放从终端输入的5个学生成绩,然后显示5个学生成绩,再将学生成绩升序排序,排序后,再次显示学生成绩。显示和排序分别用函数完成 要求ÿ…...
做了一份前端面试复习计划,保熟~
前言 以前我看到面试贴就直接刷掉的,从不会多看一眼,直到去年 9 月份我开始准备面试时,才发现很多面试经验贴特别有用,看这些帖子(我不敢称之为文章,怕被杠)的过程中对我的复习思维形成影响很大…...
虚幻引擎开发命名规则
UE的命名规则如下: 模版类以T作为前缀,例如TArray, TMap, TSet。UObject派生类都以U前缀。AActor派生类都以A前缀。SWidget派生类都以S前缀。全局对象使用G开头,如GEngine。抽象接口以I前缀。枚举以E开头。bool变量以b前缀,如bPe…...
【蓝桥杯每日一题】砍竹子
砍竹子 2024-12-7 蓝桥杯每日一题 砍竹子 STL 贪心 题目大意 这天, 小明在砍竹子, 他面前有 nn 棵竹子排成一排, 一开始第 ii 棵竹子的 高度为 h i h_i hi. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为…...
Lambda表达式随记
学习链接 目录 作用定义[capture list] 捕获列表(paramter) 参数列表mutable 可变规格throw() 异常说明-> return-type 返回类型{function statement} lambda函数体 Lambda表达式的优缺点Lambda表达式工作原理适用场景STL算法库短小不需要复用函数场景 作用 Lambda表达式&…...
Vulhub:Log4j[漏洞复现]
CVE-2017-5645(Log4j反序列化) 启动靶场环境 docker-compose up -d 靶机IPV4地址 ifconfig | grep eth0 -A 5 ┌──(root㉿kali)-[/home/kali/Desktop/temp] └─# ifconfig | grep eth0 -A 5 eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 in…...
ubuntu系统生成SSL证书配置https
自签名【Lets Encrypt】的测试证书,有效期三个月。 第一步:安装acme,如果没有安装git,需要提前安装 下载came资源 git clone https://github.com/Neilpang/acme.sh.git 无法访问,可以试用gitee的资源,安…...
记录 idea 启动 tomcat 控制台输出乱码问题解决
文章目录 问题现象解决排查过程1. **检查 idea 编码设置**2. **检查 tomcat 配置**3.检查 idea 配置文件4.在 Help 菜单栏中,修改Custom VM Options完成后保存,并重启 idea 问题现象 运行 tomcat 后,控制台输出乱码 解决排查过程 1. 检查 id…...
C++ unordered_map和unordered_set的使用
1.unordered_set系列的使用 1.1unordered_set和unordered_multiset参考文档 unordered_set和unordered_multiset参考文档 1.2unordered_set类的介绍 • unordered_set的声明如下,Key就是unordered_set底层关键字的类型 • unordered_set默认要求Key⽀持转换为整…...
【探商宝】OpenAI 发布 Sora:视频生成领域的重大突破
2024 年 12 月 10 日,OpenAI 正式推出了备受瞩目的人工智能视频生成模型 Sora,这一举措在科技界引起了轩然大波,为视频创作领域带来了全新的可能性和变革. 一、Sora 的功能与特性 1. 强大的视频生成能力 Sora 能够根据用户输入的文本描述生…...
[代码随想录Day32打卡] 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
理论基础 题型 动归基础(这一节就是基础题)背包问题打家劫舍股票问题子序列问题 动态规划五部曲 确定dp数组及其下标的含义确定递推公式dp数组如何初始化遍历顺序打印dp数组 509. 斐波那契数 简单~ dp数组及下标含义: dp[i]表示第i各斐…...
【实操GPT-SoVits】声音克隆模型图文版教程
项目github地址:https://github.com/RVC-Boss/GPT-SoVITS.git官方教程:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/tkemqe8vzhadfpeu本文旨在迅速实操GPT-SoVits项目,不阐述技术原理(后期如果有时间研究&#…...
开发一套SDK 第一弹
自动安装依赖包 添加条件使能 #ex: filetypesh bash_ls 识别 达到预期,多个硬件环境 等待文件文件系统挂在完成 或者创建 /sys/class/ 属性文件灌入配置操作 AI 提供的 netlink 调试方法,也是目前主流调用方法,socket yyds #include <linux/module.h> #include <linux…...
2024149读书笔记|Hans的阿狸五部曲——成长的路上分离在所难免
2024149读书笔记|Hans的阿狸五部曲——成长的路上分离在所难免 1. 《阿狸和小小云》2. 《阿狸和小玉》3. 《阿狸呓语》4. [202480读书笔记|《阿狸和弯月亮》——生的再普通,也是限量版](https://blog.csdn.net/qq_40985985/article/details/139731131)5. 《阿狸永远…...
外包干了5天,技术明显退步。。。。。
先说一下自己的情况,本科生,19年通过校招进入南京某软件公司,干了接近3年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…...
Ubuntu22.04 安装Isaac Lab
目录 1.1 安装IsaacLab 1.1.1 下载文件 1.1.2 创建Isaac Sim符号链接 1.1.3 创建并激活conda环境 1.1.4 安装依赖 1.1.5 安装IsaacLab扩展 1.1.6 安装完成,要source一下 1.2 验证IsaacLab安装 1.1 安装IsaacLab 1.1.1 下载文件 将 Isaac Lab 仓库克隆到您的…...
unity 2D像素种田游戏学习记录(自用)
一、透明度排序轴 改变sprite的排序方式,默认按照z轴进行排序(离摄像机的远近)。可以将其改变成y轴的排序方式,这样可以使2D人物走在草丛的下方就不被遮挡,走在草丛上方就被遮挡,如下图。 在项目设置-图形…...
NIFI使用
1 从Kafka接收消息,存储到数据库中。 (1) ConsumerKafka processor (2)Execute Scripts Processor 我这里是使用JS脚本进行处理。 还有很多其他语言的脚本。 var flowFile session.get(); if (flowFile ! null) {v…...
vue3+vite+ts 使用webrtc-streamer播放海康rtsp监控视频
了解webrtc-streamer webrtc-streamer 是一个使用简单机制通过 WebRTC 流式传输视频捕获设备和 RTSP 源的项目,它内置了一个小型的 HTTP server 来对 WebRTC需要的相关接口提供支持。相对于ffmpegflv.js的方案,延迟降低到了0.4秒左右,画面的…...
Nanolog起步笔记-9-log解压过程(3)寻找meta续
Nanolog起步笔记-9-log解压过程-3-寻找meta续 当前的目标新的改变decompressNextLogStatementmetadata查看业务面的log语句注释掉 runBenchmark();改过之后,2条记录之后,这里就直接返回了 小结 当前的目标 没有办法,还要继续。 当前的目标&a…...
未来网络技术的新征程:5G、物联网与边缘计算(10/10)
一、5G 网络:引领未来通信新潮流 (一)5G 网络的特点 高速率:5G 依托良好技术架构,提供更高的网络速度,峰值要求不低于 20Gb/s,下载速度最高达 10Gbps。相比 4G 网络,5G 的基站速度…...
【北京迅为】iTOP-4412全能版使用手册-第六十八章 U-boot基础知识
iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…...