C语言——结构体,位段,枚举和联合
目录
前言
结构体
1含义
2语法
3匿名结构体
4结构体自引用
5结构体的定义与初始化
6内存对齐
7修改对齐数
8结构体传参
位段
1含义
2位段的内存分配
编辑3位段的问题
4位段的应用
枚举
1含义
2定义
3枚举优点
4枚举使用
联合
1含义
2定义
3特点
4计算
通讯录
前言
C语言的结构体知识学好了的话对后面学习C++类对象就简单很多了
结构体
1含义
结构体是一些值的集合,这些值称为成员变量;每个成员变量可以是不同类型的变量。
2语法
struct tag//类型名
{member-list;//成员变量
}variable-list;//可在此时定义出结构体类型的变量 它是全局变量
假如我们用结构体来描述一个学生:
struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
}S1;//分号不能丢
3匿名结构体
也就是结构体不完全声明
//匿名结构体类型
struct
{int a;char b;float c;
}x;
匿名结构体省略了tag(结构体类型名),而且它只能用一次(声明后立即定义,不能声明后定义)
能否用指针来接收匿名结构体变量?
不能,编译器会认为这个两个类型(vs2019编都编不过,vs2022能编过!)
4结构体自引用
struct Node
{int data;struct Node next;
};int main()
{printf("%d", sizeof(struct Node));return 0;
}
上面这种引用行吗?
编译器认为:你在内部定义了同一个结构体成员,那这个成员变量里又包含了同一个结构体成员...这个大小是
无穷大的
所以正确的结构体自引用
struct Node
{int data;struct Node* next;
};
这种在链表中用的最多
其它的自引用定义:
typedef struct Node
{int data;N* next;
}N;
这种写法是错误的:结构体typedef之前内部并不知道
//正确写法
typedef struct Node
{int data;struct Node* next;
}N;
5结构体的定义与初始化
struct Poin
{int x;int y;
}p1 = {1,2};//可以在这里初始化struct stu
{int date;struct Poin p;
}s1;//全局变量int main()
{struct stu s2 = { 100,{20,30} };//局部变量 按顺序初始化//struct stu s2 = { .p={20,30},.date=100 };//指定成员初始化printf("%d %d %d\n", s2.date, s2.p.x, s2.p.y);return 0;
}
6内存对齐
计算结构体的大小:这个非常重要的一个内容!!!
来看下面的一段代码:
struct s1
{char a;int b;char c;
};struct s2
{char a;char c;int b;
};int main()
{printf("s1的大小:%d\n", sizeof(struct s1));printf("s2的大小:%d", sizeof(struct s2));return 0;
}
int是4字节,char是1字节,两个int和一个char加起来不是6字节吗?
不同的结构体放着相同的变量,只是顺序不同,为什么大小不一样?
介绍一个宏:offsetof,用来查看结构体变量相对于内存的偏移位置
按照打印出来的内存偏移位置进行安排成员变量的放置
一共9个字节就能结束了,偏偏还要在浪费3个字节,前面也浪费3个字节,为什么? 这时我们来看看内存对齐的规则:
1. 第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到对齐数整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值
在VS中默认的值为8 而gcc是没有默认对齐数的
3. 结构体总大小为最大对齐数(每个成员变量计算出来的对齐数的最大值)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处
结构体嵌套的结构体大小:
#include<stdio.h>struct S3//总大小:16
{double d;//8 8 -> 8char c; //1 8 -> 1int i; //4 8 -> 4
};
struct S4
{char c1; //1 8 -> 1struct S3 s3;//16 8 -> 8double d; //8 8 -> 8
};
int main()
{printf("%d\n", sizeof(struct S4));return 0;
}
那为什么存在内存对齐?
1. 平台原因(移植原因):
可能硬件平台只能在某些地址处取某些特定类型的数据(否则硬件中断);
2. 性能原因:
为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问这本质上就是以空间换时间来提高效率!
那在设计结构体时:既要省空间,又要提高效率:
尽量让字节小的成员变量放在一起
#include<stdio.h>struct s1
{char c1;int i;char c2;
};struct s2
{char c1;char c2;int i;
};int main()
{printf("%d %d", sizeof(struct s1), sizeof(struct s2));return 0;
}
7修改对齐数
如果对应VS的默认对齐数不满意(最好不修改!),可以自己设定对齐数
#pragma pack(1)
//在#pragma的范围内的对齐数是1
struct s3
{char c1;int i;char c2;
};
#pragma()struct s4
{char c1;int i;char c2;
};int main()
{printf("s3=%d s4=%d", sizeof(struct s2), sizeof(struct s3));return 0;
}
8结构体传参
struct S
{int data[1000];int num;
};
struct S s = { {1,2,3,4}, 1000 };void print1(struct S s)
{printf("%d\n", s.num);
}void print2(struct S* ps)
{printf("%d\n", ps->num);
}int main()
{print1(s); //传结构体print2(&s); //传地址 //那种方式更优点?return 0;
}
关于结构体传参,尽量使用传址传参:
因为一个结构体大小可能很大,如果传值传参会加大系统资源的开销,导致性能的下降;而使用传址传参时数据不希望进行修改,要把const加上!
位段
1含义
位段是一种特殊的自定义类型;
对空间的利用精打细算
a 位段的成员必须是 int、char(整形家族);
b 位段的成员名后边有一个冒号和一个数字
struct A
{int _a : 2;int _b : 5;int _c : 10;int _d : 30;
};
与结构体相比大小方面有什么不同吗?
struct A//如果是结构体
{int _a : 2;int _b : 5;int _c : 10;int _d : 30;
};struct B
{int _a;int _b;int _c;int _d;
};int main()
{printf("A=%d B=%d", sizeof(struct A),sizeof(struct B));return 0;
}
答案:位段比结构体大小要小,更节省空间了!那这是怎么实现的呢?
2位段的内存分配
位段后面的数字代表要分配多少个bit空间给该成员;
位段的空间是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的
#include<stdio.h>struct S
{char a : 3;char b : 4;char c : 5;char d : 4;
};int main()
{struct S s = { 0 };s.a = 10;s.b = 12;s.c = 3;s.d = 4;return 0;
}
3位段的问题
1. int 位段被当成有符号数还是无符号数?
2. 位段中最大位的数目?(16位机器最大16,32位机器最大32,如果写成27,在16位机器会出问题)
3. 位段中的成员在内存中从左向右分配,还是从右向左分配?(在VS时从右向左)
4. 开辟的空间无法容纳下个位段时,是舍弃后另外开辟空间还是利用?(在VS时舍弃剩余的位)
4位段的应用
应用于各种协议(信息传到下一层时需要用到)
枚举
1含义
枚举就是一一列举;在现实生活中把一个星期进行枚举:星期一,星期二,星期三... 那么枚举怎么用代码来表示呢?
2定义
enum Day//星期
{Mon = 1,Tues,Wed,Thur,Fri,Sat,Sun
};
enum Day是一个枚举类型;
枚举括号内的内容都是常量;
枚举默认从0开始(与数组一样);但你也可以自己修改(Mon = 1)
3枚举优点
以上对于星期的枚举:我们也可以用#define Mon 1,#define Tues 2来表示,那是不是就说枚举就可以被替换了?
a 使用枚举方便调试(而#define在调试前就被替换成常量);
b 枚举有类型检查,更严谨写;
b 使用枚举能增加代码的可读性与可维护性;
c 枚举内定义变量不存在命名冲突(而#define可能有命名污染问题)
4枚举使用
enum Color//颜色
{RED=1,GREEN=2,BLUE=4
};
int main()
{enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异return 0;
}
联合
1含义
联合也是一种特殊的自定义类型;
这种类型定义的变量也包含一系列的成员,这些成员公用同一块空间(所以联合也叫共用体)。
2定义
#include<stdio.h>
//联合类型的声明
union Un
{char c;int i;
};
int main()
{union Un un;printf("%d\n", sizeof(un));return 0;
}
3特点
a 由于联合类型共有内存空间,所以比其它的结构体而言节省空间;
b 成员共有内存空间,所以定义变量时成员不能同时出现(后一个会改变前一个的数据)
使用场景1:判断大小端(之前通过地址方式访问判断)
#include<stdio.h>
int sys_call()
{//匿名联合union{char c;int i;}Un;Un.i = 1;// 01 00 00 00 还是 00 00 00 01//(c与i公用1字节的内存空间)return Un.c;
}int main()
{if (sys_call()){printf("小端\n");}else{printf("大端\n");}return 0;
}
使用场景2:设计一个礼物清单
struct git_list
{double price;char name[20];char author[20];int page;char form[20];double size;char flavour[20];char materials[20];
};//利用联合体设计清晰且省空间
struct git_list
{double price;char name[20];union{char author[20];int page;}book;union{char form[20];double size;}mug;union{char flavour[20];char materials[20];}cooike;
};
4计算
a 联合的大小至少是最大成员的大小;
b 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍;所以:联合大小 != 最大成员大小
#include<stdio.h>union Un1
{char c[5];int i;
};int main()
{printf("%d\n", sizeof(union Un1));return 0;
}
你可能会因为大小是5(char c[5]一共是5字节,比i 4字节大),但实际上:
最大是5没错,但它不是最大对齐数(max(char,int) = 4)的整数倍,进行要进行对齐
通讯录
实现一个通讯录,具备以下功能:
1增加联系人(名字,年龄,性别,电话,地址);
2删除联系人的信息;
3查找联系人的信息;
4更改联系人的信息;
5打印通讯录;
6对通讯录进行排序;
//Contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>#define Max_Size 100
#define Max_NameSize 20
#define Max_SexSize 5
#define Max_CallSize 20
#define Max_AddrSize 30enum
{ext,add,del,check,modify,print,sort,
};typedef struct Mess
{char name[Max_NameSize];int age;char sex[Max_SexSize];char call[Max_CallSize];char addr[Max_AddrSize];
}Mess;typedef struct Contact
{int sz;Mess message[Max_Size];
}Contact;void Add(Contact* con);
void Del(Contact* con);
void Check(const Contact* con);
void Modify(Contact* con);
void Print(const Contact* con);
void Sort(Contact* con);//Contact.c
#include"contact.h"void Add(Contact* con)
{assert(con);if (con->sz == Max_Size){printf("Contact Is Full\n");return;}printf("Input Name:");gets(con->message[con->sz].name);//scanf("%s", &con->message[con->sz].name);printf("Input Age:");scanf("%d", &con->message[con->sz].age);//如果输入的是非法字符串?getchar();//清空缓冲区的'\n'printf("Input Sex:");gets(con->message[con->sz].sex);//scanf("%s", &con->message[con->sz].sex);printf("Input Call:");gets(con->message[con->sz].call);//scanf("%s", &con->message[con->sz].call);printf("Input Addr:");gets(con->message[con->sz].addr);//scanf("%s", &con->message[con->sz].addr);con->sz++;printf("Add Finish\n");
}void Print(const Contact* con)
{assert(con);if (con->sz == 0){printf("Contact Is Empty\n");return;}printf("%-20s %-5s %-5s %-11s %-30s\n", "name", "age", "sex", "call", "addr");for (int i = 0; i < con->sz; i++){printf("%-20s %-5d %-5s %-11s %-30s\n",con->message[i].name, con->message[i].age, con->message[i].sex,con->message[i].call,con->message[i].addr);}
}static int Find(const Contact* con,char Name[])
{for (int i = 0; i < con->sz; i++){if (strcmp(con->message[i].name,Name)==0)//用strcmp比{printf("Find Sucess\n");return i;}}printf("Find Error\n");return -1;
}void Del(Contact* con)
{assert(con);char InputName[Max_NameSize];printf("Input Del Name:");gets(InputName);int DelPos = Find(con, InputName);if (DelPos == -1) return;for (int i = DelPos; i < con->sz - 1; i++){con->message[i] = con->message[i + 1];//后一个往前一个覆盖}con->sz--;printf("Del Sucess\n");}void Check(const Contact* con)
{assert(con);printf("Input Check Name:");char Check_Name[Max_NameSize];gets(Check_Name);int pos = Find(con, Check_Name);if (pos == -1) return;printf("Check Result:\n");printf("%-20s %-5s %-5s %-11s %-30s\n", "name", "age", "sex", "call", "addr");printf("%-20s %-5d %-5s %-11s %-30s\n",con->message[pos].name, con->message[pos].age,con->message[pos].sex, con->message[pos].call,con->message[pos].addr);
}void Modify(Contact* con)
{assert(con);char Modify_Name[Max_NameSize];printf("Input Modify Name:");gets(Modify_Name);int pos = Find(con, Modify_Name);if (pos == -1) return;printf("Modify Name:");gets(con->message[pos].name);printf("Input Modify Age:");scanf("%d", &con->message[pos].age);getchar();printf("Input Modify Sex:");gets(con->message[pos].sex);printf("Input Modify call:");gets(con->message[pos].call);printf("Input Modify addr:");gets(con->message[pos].addr);printf("Modify Sucess\n");
}int cmp(const void* a, const void* b)
{return ((*((Contact*)a)).message->age - (*((Contact*)b)).message->age);
}void Sort(Contact* con)
{qsort(con, con->sz, sizeof(con->message[0]), cmp);printf("排序完成\n");
}//test.c
#include"contact.h"void memu()
{printf("********************************\n");printf("***** 0.exit 1.add *****\n");printf("***** 2.del 3.check *****\n");printf("***** 4.modify 5.print *****\n");printf("***** 6sort *****\n");
}int main()
{Contact con;//对con空间进行清理memset(&con, 0, sizeof(con));int input;do{memu();printf("Please Select:");//防止读到字符串时发生死循环input = 123456;//防止下一次输入的是字符后input还是上一次的值scanf("%d", &input);getchar();//输入字符串时:清空缓冲区的'\n'switch (input){case ext:printf("Process Exit");break;case add:Add(&con);break;case del:Del(&con);break;case check:Check(&con);break;case modify: Modify(&con);break;case print:Print(&con);break;case sort:Sort(&con);break;default:printf("Select Error,Please Try Again\n");break;}}while(input);return 0;
}
但上面的通讯录无法做到:
通讯录满了无法再存信息(学习动态内存管理后解决);
关闭程序时通讯录信息还存在(学习完文件操作后解决);
以上便是全部内容,有问题欢迎在评论区指正,感谢观看!
相关文章:
C语言——结构体,位段,枚举和联合
目录 前言 结构体 1含义 2语法 3匿名结构体 4结构体自引用 5结构体的定义与初始化 6内存对齐 7修改对齐数 8结构体传参 位段 1含义 2位段的内存分配 编辑3位段的问题 4位段的应用 枚举 1含义 2定义 3枚举优点 4枚举使用 联合 1含义 2定义 3特点 4计…...
现场展示deepseek VS openAI o1模型大对比
DeepSeek-V3 模型的发布在 AI 领域引起了广泛关注。作为一款拥有 6850 亿参数的混合专家(MoE)语言模型,DeepSeek-V3 在多个基准测试中表现出色,甚至超越了一些闭源模型。其在 Aider 代码能力排行榜上的正确率达到 48.4%࿰…...
深度解析 tanh tanh 激活函数
1. 引言 在现代深度学习中,激活函数(Activation Function)是神经网络的核心组件之一。它的主要作用是引入非线性,从而使神经网络能够学习和表示复杂的非线性关系。如果没有激活函数,神经网络的输出将只是输入的线性组…...
【Golang 面试题】每日 3 题(二十五)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
Unity Canvas中显示粒子特效
首先在场景中新建一个粒子特效 修改一下参数 1.改变粒子特效的渲染层级,层级修改为UI层,由UI相机渲染 使用粒子特效的Sorting Layer ID和Order In Layer,Sorting Layer ID设置为UI(如果没有UI层则新建就好了),对UI进行排序 对于要显示在前的UI组件添加Canvas组件,设置O…...
excel精简使用工具
1.获取sheet1的行填充到sheet2的列 希望在 Excel 中使用 INDEX 函数从不同的列中提取数据,并且每一行都引用不同的列。为了实现这个目标,你可以使用 COLUMN 函数来动态获取列的偏移量。 为了避免手动输入每个单元格的公式,你可以使用以下公…...
上手体验微软全新整合的王炸平台Fabric
体验确实不错,微软强大的生态能力。 把可视化,数仓,数据胡,数据工厂,机器学习,数据监控等技术都整合到一个平台了。所有数据全都存储在统一的one lake数据中心,消除数据孤岛问题。而且不同角色可…...
Linux 下 Vim 环境安装踩坑问题汇总及解决方法(重置版)
导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(初版)Linux 下Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(重置版)Windows …...
RabbitMQ 可观测性最佳实践
RabbitMQ 简介 RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写,支持多种客户端。它通过使用交换机(Exchanges)、队列(Queues)和绑定(Bindings)来路由消息ÿ…...
束搜索、组束搜索介绍、异同及相关参数
束搜索(Beam Search)与组束搜索(Group Beam Search)介绍 束搜索(Beam Search) 束搜索是一种用于序列生成任务的解码算法,广泛应用于自然语言处理领域,如机器翻译、语音识别等。它的…...
深度学习与计算机视觉 (博士)
文章目录 零、计算机视觉概述一、深度学习相关概念1.学习率η2.batchsize和epoch3.端到端(End-to-End)、序列到序列(Seq-to-Seq)4.消融实验5.学习方式6.监督学习的方式(1)有监督学习(2)强监督学习(3)弱监督学习(4)半监督学习(5)自监督学习(6)无监督学习(7)总结:不同…...
新时期下k8s 网络插件calico 安装
1、k8s master节点初始化完毕以后一直处于notreadey状态,一直怀疑是安装有问题或者是初始化有问题(当然,如果真有问题要先解决这些问题),经过不断探索才发现是网络插件没有安装导致的,根据建议安装calico插…...
14:00面试,15:00就出来了,问的问题过于变态了。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到2月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
Improving Language Understanding by Generative Pre-Training GPT-1详细讲解
Improving Language Understanding by Generative Pre-Training 2018.06 GPT-1 0.有监督、半监督、无监督 CV:ImageNet pre-trained model NLP:pre-trained model? 在计算机视觉中任务包含分类、检测、分割,任务类别数少,对应…...
Docker: 现代开发的利器,从入门到实践
引言 在现代软件开发中,开发人员面对的环境多种多样,不同操作系统、依赖、库版本等都会影响应用程序的正常运行。传统的开发和部署流程复杂且易错,"在我机器上可以跑"的困扰让许多开发者头疼。而 Docker,一个容器化技术…...
nuxt3 env环境变量
加载env文件 在package.json中指定运行某个env文件:nuxt build --dotenv .env.production 具体如下: "scripts": {"build-dev": "nuxt build --dotenv .env.test","build-prd": "nuxt build --dotenv .e…...
Vue3 自定义插件(plugin)
文章目录 Vue3 自定义插件(plugin)概述用法 Vue3 自定义插件(plugin) 概述 插件 (Plugins) 是一种能为 Vue 添加全局功能的工具代码。 用法 Vue3 插件有2种定义方式: 对象形式。对象中有install方法。函数形式。函数本身就是安装方法,其中ÿ…...
HTB:Bank[WriteUP]
目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 提取出靶机TCP开放端口 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用curl对域名进行访问…...
Elastic-Job相关
文档参考视频:09_SpringBoot案例演示_哔哩哔哩_bilibili 一、Elastic-Job介绍 Elastic-Job 是一个轻量级、分布式的任务调度框架,旨在解决分布式环境下的定时任务调度问题。 1.1. Elastic-Job 的核心组件 Elastic-Job 是由多个核心组件构成的&#x…...
Ruby语言的正则表达式
Ruby语言的正则表达式详解 正则表达式(Regular Expressions,简称Regex)是一种强大的文本处理工具,它可以用来匹配、搜索、替换字符串中的模式。在Ruby语言中,正则表达式的使用非常灵活,并且具有良好的可读…...
“深入浅出”系列之QT:(5)Json数据格式处理详解
一、JSON数据结构 JSON主要有两种数据结构:JSON对象和JSON数组。 JSON对象:由键值对组成,每个键(key)是字符串,值(value)可以是字符串、数字、布尔值、null、JSON数组或JSON对象。对…...
cursor试用出现:Too many free trial accounts used on this machine 的解决方法
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
Calico BGP网络问题
Calico BGP网络问题 文章目录 Calico BGP网络问题排除步骤calico-node 正常运行,但在 describe 中有警告信息错误现象 ip route 路由表中删除 blackhole后又会自动生成网卡选择无效导致 calico 的 pod 内容器未就绪问题现象原因分析问题解决方式一:直接修…...
Jenkins-部署-windows
Jenkins-部署-windows 一: Jenkins 资料 一: Jenkins 资料...
benchANT 性能榜单技术解读 Part 1:写入吞吐
近期,国际权威数据库性能测试榜单 benchANT 更新了 Time Series: Devops(时序数据库)场景排名,KaiwuDB 数据库在 xsmall 和 small 两类规格下的时序数据写入吞吐、查询吞吐、查询延迟、成本效益等多项指标刷新榜单原有数据纪录。在…...
【 算法设计与分析-回顾算法知识点】福建师范大学数学与计算机科学学院 2006 — 2007学年第二学期考试 A 卷
一.填空题(每空2分,共30分) 1.算法的时间复杂性指算法中 元运算 的执行次数。 2.在忽略常数因子的情况下,O、和三个符号中, O 提供了算法运行时间的一个上界。 3.设Dn…...
【25考研】川大计算机复试情况,重点是啥?怎么准备?
24年进入复试的同学中,有10位同学的复试成绩为0分。具体是个人原因还是校方原因,还尚不明确。但是C哥提醒,一定要认真复习!复试完后不要跟任何人讨论有关复试的题目及细节! 一、复试内容 四川大学复试内容较多…...
设计模式-结构型-适配器模式
在软件开发中,随着系统的不断扩展和模块的不断增加,往往会遇到不同模块之间接口不兼容的情况。此时,如果我们能通过某种方式将一个接口转化为另一个接口,那么开发工作将变得更加灵活和高效。适配器模式(Adapter Patter…...
el-table表格合并某一列
需求:按照下图完成单元格合并,数据展示 可以看到科室列是需要合并的 并加背景色展示;具体代码如下: <el-tableref"tableA":data"tableDataList":header-cell-style"{ backgroundColor: #f2dcdb, col…...
分布式Id方案选择
分布式 ID 方案选择 在当今分布式系统日益盛行的背景下,分布式 ID 生成方案的选择成为了众多开发者关注的焦点。一个优秀的分布式 ID 方案,不仅能够确保生成的 ID 全局唯一,避免数据冲突,还能在高并发、大规模的分布式环境中保持…...
uni app 写的 小游戏,文字拼图?文字拼写?不知道叫啥
从下方的偏旁部首中选在1--3个组成上面文章中的文字,完成的文字标红 不喜勿喷 《满江红》 其中用到了两个文件 strdata.json parameters.json 这两个文件太大 放到资源中了 资源文件 <template><view class"wenzi_page_main"><view c…...
【xLua】xLua-master签名、加密Lua文件
GitHub - Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc. 如果你想在项目工程上操作,又发现项目工程并没导入Tools,可以从xLua-master工程拷贝到项目工程Assets…...
Yolo11改进:注意力改进|Block改进|ESSAformer,用于高光谱图像超分辨率的高效Transformer|即插即用
摘要 一、论文介绍 高光谱图像超分辨率的重要性:高光谱成像技术通过密集采样光谱特征,为材料区分提供丰富的光谱和空间结构信息,广泛应用于各领域。高光谱图像超分辨率(HSI-SR)旨在从低分辨率HSI生成高分辨率HSI。传统方法的局限性:传统方法依赖手工制作的先验,如低秩近…...
第二十八周学习周报
目录 摘要Abstract1 GFPGAN1.1 总体结构1.2 实验研究1.3 代码分析 总结 摘要 本周主要的学习内容是GFPGAN模型。GFPGAN是一种基于生成对抗网络(GAN)的模型,其利用封装在预训练的人脸GAN中的丰富多样的先验进行人脸图像的修复。这种生成面部先验(GFP&…...
太速科技-418-基于AD9361 +ZYNQ7020 的软件无线电 SDR 套件
基于AD9361 ZYNQ7020 的软件无线电 SDR 套件 一、板卡信息 ● ZYNQ芯片采用XC7Z020,逻辑容量更大,支持更大的逻辑设计; ● 内存采用两片512M DDR3,共1GByte,更大容量。 ● 支持千兆网口,支持ZEDFMCO…...
STM32裸机开发转FreeRTOS教程
目录 1. 简介2. RTOS设置(1)分配内存(2)查看任务剩余空间(3)使用osDelay 3. 队列的使用(1)创建队列(1)直接传值和指针传值(2)发送/接收…...
swagger导出json
要将 Swagger(或者 OpenAPI)文档导出为 JSON 文件,通常有几种常见的方法,具体取决于你使用的 Swagger 工具(如 Swagger UI、Swagger Editor、Swagger Hub 等)。下面列出了几种常见的导出 JSON 文件的方法。 1. 通过 Swagger UI 导出 JSON 文件 如果你在使用 Swagger UI…...
大纲笔记幕布的替换
文章目录 前言类似的大纲软件探索 DynalistLogseq通过国内代码仓库建立 Git 仓库Logseq 的使用PC 端安卓端Git 操作Termux git 步骤Termux 的桌面组件:Termux widget 报错参考 前言 之前我一直用幕布,买了三年,奈何要过期了,又三…...
【Excel/WPS】根据平均值,生成两列/多列指定范围的随机数/随机凑出两列数据
原理就是通过随机生成函数和平均值函数。 适用场景:在总体打分后,需要在小项中随机生成小分数 第一列:固定的平均值A2第二列: RANDBETWEEN(A2-10,A210)第三列:根据第二列用平均值函数算除 A2*2-B2这是随机值1的公式&am…...
单元测试MockitoExtension和SpringExtension
1. MockitoExtension MockitoExtension 是 JUnit 5 提供的一个扩展,用于支持 Mockito 的集成。它可以自动初始化标记为 Mock、InjectMocks 等的 Mockito 对象,而不需要显式调用 MockitoAnnotations.initMocks(this)。 主要特点: 自动初始化 Mock、Spy…...
springboot+vue使用easyExcel实现导出功能
vue部分 // 导出计算数据exportDataHandle(id) {this.$http({url: this.$http.adornUrl(/xxx/xxx/exportCalDataExcel),method: post,data: this.$http.adornData({id: id}),responseType: blob, // 重要:告诉axios我们希望接收二进制数据}).then(({data}) > {c…...
优化提示词改善答疑机器人回答质量
1.通过优化提示词来调整大模型的回答 1.1使用场景 默认提示词无法满足业务要求。 回答的内容太简单/困难,输出内容/格式/语气达不到要求等 1.2llama-index 的提示词模版 1.2.1llama-index 的默认模板 from llama_index.llms.dashscope import DashScope from lla…...
Spring AMQP-保证消费者消息的可靠性
为什么要保证消息的可靠性? 当MQ向消费者发送一个消息之后需要得到消费者的状态,因为消息并不一定就真的被消费者给消费了,可能在消费的过程中出现了一些意外,比如 1. 网络问题 2. 消息转换有问题 3. 消费者本身的业务处理有问题 …...
32单片机从入门到精通之数据处理——数学运算(十三)
无论你身在何处,无论你面对什么困难,只要对自己充满信心,坚持不懈地努力,相信自己的能力,你就能战胜任何困难,实现自己的目标。不要害怕失败,因为失败并不意味着你没有能力成功,只是…...
latex_学习
参考: https://www.overleaf.com/learn/latex/Free_online_introduction_to_LaTeX_(part_3)https://www.overleaf.com/learn/latex/Free_online_introduction_to_LaTeX_(part_2)https://www.overleaf.com/learn/latex/Free_online_introduction_to_LaTeX_(part_1) …...
小程序textarea组件键盘弹起会遮挡住输入框
<textarea value"{{remark}}" input"handleInputRemark" ></textarea> 如下会有遮挡: 一行代码搞定 cursor-spacing160 修改后代码 <textarea value"{{remark}}" input"handleInputRemark" cursor-spacin…...
vue之element-ui文件上传(二)
一、点击上传,使用默认的action上传,添加校验,上传成功后,去除校验: <el-form-item label"文件md5" prop"fileMd5"><el-uploadv-if"!form.fileMd5"v-model"form.fileMd5&…...
DC/AC并网逆变器模型与仿真MATLAB
DC/AC并网逆变器是一种将直流电(DC)转化为交流电(AC),并将其与电网并联的设备。它的核心功能是实现直流电源(如光伏电池板或储能电池)与电网的有效连接,同时保证输出电能质量满足电网…...
python面向对象
面向对象简介 python完全采用了面向对象的思想,是真正面向对象的变成语言,完全支持面向对象的基本功能,例如:继承、多态、封装等 python中,一切皆为对象。前面学习的数据类型、函数等都是对象 面向过程和面向对象思…...
【UI自动化测试】selenium八种定位方式
🏡个人主页:謬熙,欢迎各位大佬到访❤️❤️❤️~ 👲个人简介:本人编程小白,正在学习互联网求职知识…… 如果您觉得本文对您有帮助的话,记得点赞👍、收藏⭐️、评论💬&am…...