C语言笔记(自定义类型:结构体、枚举、联合体 )
前言
本文对自定义类型的结构体创建、使用、结构体的存储方式和对齐方式,枚举的定义、使用方式以及联合体的定义、使用和存储方式展开叙述,如有错误,请各位指正。
目录
前言
1 结构体
1.1 结构体的声明
1.2 结构体的自引用
1.3 结构体变量的定义和初始化
1.4 结构体变量的内存对齐
1.5 修改默认对齐数
1.6 结构体传参
2.位段
2.1 位段的内存分配
2.2 位段的跨平台问题
3.枚举
3.1枚举类型的定义
3.2枚举的优点
3.3枚举的使用
4. 联合(共用体)
4.1 联合类型的定义
4.2 联合的特点
4.3 联合大小的计算
1 结构体
结构体是一些值的集合,这些值称为成员变量,结构的每一个成员可以是不同类型的变量。
1.1 结构体的声明
struct tag
{
member-list;
}variable-list;
tag 结构体标签
member-list 成员列表
variable-list 变量列表
注意:创建结构提变量的时候最后的 ; 不能丢掉
结构体就创建一个自定义的包含多种数据类型的数据类型
示例
创建一个描述学生的结构体数据类型 Stu
struct Stu
{char name[20];int age;char sex;char id[20];
};
特殊声明 :匿名结构体类型,没有结构体的标签,没有给结构体起名字。
示例1(创建没有标签的结构体)
struct
{int a;char b;float c;
}x;//x创建的结构体变量
这种结构的使用只能现创现用,在不同的位置是无法创建同一类型的结构体变量的,创建变量需要结构体标签,没有标签就是创建不了变量了。
示例2(创建结构体的指针)
struct
{
int a;
char b;
float c;
} *p;
示例1和示例2中下方等式成立吗?
p = &x;
1.2 结构体的自引用
结构体的自引用就是结构体中包含结构体的指针。
示例:在数据结构中数据的存放有链表性结构,链表中的每一处的节点都会存放一个数据,还可以根据节点找到下一个节点的地址,然后创建结构体;那么我结构体存放节点的数据和指向下一个节点的指针就可以了,这就是结构体的自引用了。
struct Node
{int data;// 节点的数据struct Node* next;// 下一个节点的地址
};
结构的创建变量的时候名字较为复杂还有 unsigned int 、unsigned char等等 都可以使用 typedef重新定义名字,这样在创建变量的时候就简单了,如下
//重新定义变量
typedef unsigned int uint;
typedef unsigned char uchar;
typedef char u8;
typedef struct Stu Stu;
//创建变量
unit a;
unchar b;
u8 c;
Stu x;
需要注意
在结构体创新命名的时候,需要结构体有标签。
1.3 结构体变量的定义和初始化
结构体定义就是创建结构体变量,以下是创建结构提变量的方式:
//方式1 创建结构体的时候创建全局变量
struct Point
{int x;int y;
}a1;
//方式2
struct Point a2;
//方式3
int main()
{struct Point a3;return 0;
}
初始化和和数组的初始化较为相似,是应用{ }来初始换结构体创建的变量,在后面附上值就可以了,完全初始化,
struct Point
{int x;int y;
}a1 = {10,20};
struct Point a2 = {5,9};int main()
{struct Point a3 = { 2,3 };return 0;
}
不完全初始化(一个一个的给变量赋值)
struct S s1= { .num=10,.ch='q',.p.x=6, .p.y=10 };
嵌套结构体的初始化,有几个结构体就用几个{ }来创建变量,示例如下:
struct Point1
{int x;int y;
};
struct Point2
{int z;char ch;struct Point1 a1;float d;
};
int main()
{struct Point2 s = { 1,'a',{1,2},6.14f };return 0;
}
结构体的访问方式,分为两种,一种是使用 . 符号来访问,一种是使用 -> 符号来访问
struct Point
{int x;int y;
};
struct S
{int num;char ch;struct Point p;float d;
};int main()
{// 初始化struct S s = { 3,'w',{1,2},3.15f };//访问printf("%d %c %d %d %0.1f\n", s.num,s.ch,s.p.x, s.p.y, s.d);return 0;
}
struct Stu
{char name[20];int age;char sex[20];float score;
};
int main()
{//打印结构体信息struct Stu s = { "张三", 20, "男", 95.0f };struct Stu *ps = &s;printf(" %s %d %s %.1f\n", ps->name, ps->age, ps->sex, ps->score);return 0;
}
1.4 结构体变量的内存对齐
结构体的内存对齐决定了结构体的在内存中所占用的空间大小。
引入
创建两个结构体,结构体中的变量类型相同,但是顺序不同,其内存大小一样吗?
struct S1
{char c1;int i;char c2;
};
struct S2
{char c1;char c2;int i;
};
int main()
{printf("%d\n", sizeof(struct S1));//12printf("%d\n", sizeof(struct S2));//8return 0;
}
1.结构体的顺序不一样,内存不一样;
2.内存的大小和成员的数据类型有关吗?
结构体的对齐方式按照以下几条
1.结构体的第一成员,对齐到结构体在内存中的存放位置的0偏移处;
2.从第二个成员开始,每个成员都要对齐到(一个对齐数)的整数倍处;
对齐数:结构体成员自身大小和默认对齐数的较小值;
VS:默认对齐数为8;
Linux gcc :没有默认对齐数,对齐数就是结构题成员的自身大小;
3.结构体的总大小,必须是所有成员的对齐数中最大对齐数的整数倍。
4.如果结构体中嵌套了结构体成员,要将嵌套的结构体成员的对齐到自己的成员中最大的对齐数的整数。(结构体的总大小必须是最大对齐数的整数倍,包含请嵌套结构体成员的对齐数,是所有对齐数的最大值)
S1的结构体存储的方式
struct S1
{char c1;int i;char c2;
};
(1)c1是第一个成员,从0偏移量存储,占用一个字节(灰色);
(2)i为整型变量,对齐数为4,默认对齐数为8,取较小值为4,偏移量为4,偏移量 1,2,3处内存浪费掉了(黄色);
(3)c2字符变量,对齐数为1,默认对齐数为8,取较小值为1,占用偏移量为8的位置(红色);
(4)确定结构体的大小,从c1到c2处,占用了9个字节的空间,取结构体成员的最大对齐数4,因此内存要占用12个字节,浪费6个字节(蓝色)。
S1的结构体存储的方式
struct S2
{char c1;char c2;int i;
};
(1)c1是第一个成员,从0偏移量存储,占用一个字节(灰色);
(2)c2字符变量,对齐数为1,默认对齐数为8,取较小值为1,偏移量是对齐数的倍数 2,占用偏移量为2的位置(红色);
(3)i为整型变量,对齐数为4,默认对齐数为8,取较小值为4,偏移量为4,去偏移量的倍数 4,偏移量 2,3处内存浪费掉了(黄色);
(4)确定结构体的大小,取结构体成员的最大对齐数4,因此内存要占用8个字节,浪费2个字节空间(蓝色)。
使用 offsetof函数来验证上述的偏移量是否正确,这个函数就是计算偏移量的,头文件是stddef,
验证程序
struct S1
{char c1;int i;char c2;
};
struct S2
{char c1;char c2;int i;
};
int main()
{printf("%d\n", sizeof(struct S1));//12printf("%d\n", offsetof(struct S1, c1));//0printf("%d\n", offsetof(struct S1,i));//4printf("%d\n", offsetof(struct S1,c2));//8return 0;
}
嵌套结构体内存对齐,
#include <stdio.h>
#include <stddef.h>
struct S2
{char c1;char c2;int i;
};
struct S3
{double d;struct S2 s2;int a;
};
int main()
{printf("%d\n", sizeof(struct S3));//24printf("%d\n", offsetof(struct S3,d));//0printf("%d\n", offsetof(struct S3,s2));//8printf("%d\n", offsetof(struct S3,a));//16return 0;
}
S3是如何对齐呢?
struct S3
{double d;struct S2 s2;int a;
};
(1)d是第一个成员,从0偏移量存储,占用8个字节(灰色);
(2)s3为结构体变量,结构体成员最大的对齐数为4,默认对齐数为8,取较小值为4,偏移量是对齐数的倍数 8,占用偏移量为8的位置(黄色);
(3)a为整型变量,对齐数为4,默认对齐数为8,取较小值为4,偏移量取16,取偏移量的倍数 16(黄色);
(4)确定结构体的大小,取结构体成员的最大对齐数8,因此内存要占用24个字节,浪费4个字节空间(蓝色)。
为什么要对齐呢?
1. 程序移植: 不是所有的平台数据的存储方式和访问方式是一样的。
2. 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
总结:结构体的对齐就是利用内存换取运行时间的手段。
如何节省空间?
将占用空间小的成员集中到一起。
1.5 修改默认对齐数
#pragma pack()//恢复默认对齐数
#pragma pack(1)//设置对齐数为1
#include <stdio.h>
#include <stddef.h>
#pragma pack(1)//设置对齐数为1
struct S1
{char c1;int i;char c2;
};
#pragma pack()//恢复默认对齐数int main()
{printf("%d\n", sizeof(struct S1));//6printf("%d\n", offsetof(struct S1,c1));//0printf("%d\n", offsetof(struct S1,i));//1printf("%d\n", offsetof(struct S1,c2));//5return 0;
}
此时S1的空间对齐方式
(1)c1是第一个成员,从0偏移量存储,占用一个字节(灰色);
(2)i为整型变量,对齐数为1,偏移量为1,(黄色);
(3)c2字符变量,对齐数为1,占用偏移量为5的位置(红色);
(4)确定结构体的大小,从c1到c2处,占用了6个字节的空间。
1.6 结构体传参
结构体传参一般采用地址传参的方式,在传递值传参的时候,需要重新创建变量,浪费大量的内存空间,传址调用较为省空间。
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;
}
2.位段
位段的声明和结构体类似,有两种不同的标志
1.位段的成员必须是 int 、unsigned int、或者是signed int;
2.位段的成员名后有一个冒号和一个数字。
struct A
{int _a:2;int _b:5;int _c:10;int _d:30;
};
A是一个位段类型,位段的大小是多少呢?
printf("%d", sizeof(struct A));//8
原本4个整型数据,占据16个字节,如何在内存中限制到8个字节的呢?
2.1 位段的内存分配
1. 位段的成员可以是 int unsigned、 int、 signed int 、 char 类型
2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
struct S
{char a:3;char b:4;char c:5;char d:4;
};struct S s = {0};s.a = 10;s.b = 12;s.c = 3;s.d = 4;
位段开辟空间一次开辟一个字节,不够使用的话再开辟另一个字节;位段是从低地址到高地址存储的,在每个字节中也是从低位向高位存储;
2.2 位段的跨平台问题
1. int 位段被当成有符号数还是无符号数是不确定的。
2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机
器会出问题。
3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
舍弃剩余的位还是利用,这是不确定的。
特点:位段和结构体相比,位段的存储空间为共用空间,位段更加节省空间,但是存在跨平台问题。
3.枚举
3.1枚举类型的定义
可以被一一列举的变量,语法形式和结构体类似,例如生活中的,
1.一周的星期一到星期日有限的7天,可以一一列举;
2.性别有:男、女分别;
3.一年有12个月,可以一一列举。
enum Day
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};
enum Sex
{MALE,FEMALE,SECRET
};
三原色
enum Color
{RED,GREEN,BLUE};
上述是有可能取到的值,默认从零开始一次递增,在定义的时候可以赋初值,示例
#include <stdio.h>
enum Day
{Mon = 1,Tues = 2,Wed = 3,Thur = 4 ,Fri = 5,Sat = 6,Sun = 7
};
int main()
{printf("%d\n", Mon);//1printf("%d\n", Tues);//2return 0;
}
枚举常量就是给特定的字符赋予一定的数值,在后续的使用中Mon和1等价。
3.2枚举的优点
和#define相比枚举创建的常量可以在调试中显示,而宏定义是不可以的。
1. 增加代码的可读性和可维护性;
2. 和#define定义的标识符比较枚举有类型检查,更加严谨;
3. 防止了命名污染(封装);
4. 便于调试;
5. 使用方便,一次可以定义多个常量。
3.3枚举的使用
下述代码是用于C51单片机的按键控制LED亮灭的程序,创建的枚举变量使用的时候程序较好理解,如果将KEY1_PRESS为1的话,并不是特别的直观的表达出按键1以将按下。
#include <REGX52.H>
#include <stdio.h>
//引脚定义
#define SMG_A_DP_PORT P1
sbit KEY1 = P0 ^ 0;
sbit KEY2 = P0 ^ 1;
sbit KEY3 = P0 ^ 2;
sbit KEY4 = P0 ^ 3;
sbit LED1 = P2 ^ 0;
sbit LED2 = P2 ^ 1;
sbit LED3 = P2 ^ 2;
sbit LED4 = P2 ^ 3;enum KEY
{KEY_UNPRESS = 0,KEY1_PRESS = 1,KEY2_PRESS = 2,KEY3_PRESS = 3,KEY4_PRESS = 4,
};//枚举
char key_scan(mode);//当mode=0的时候 单次扫描 mode=1 连扫
void main()
{unsigned char ret = 0;while (1){ret = key_scan(0);switch (ret){case KEY1_PRESS:{LED1 = !LED1;break;}case KEY2_PRESS:{LED2 = !LED2;break;}case KEY3_PRESS:{LED3 = !LED3;break;}case KEY4_PRESS:{LED4 = !LED4;break;}}}}//延时函数 当1=ten_us,延时10us
void delay_10us(unsigned int ten_us)
{while (ten_us--);
}
char key_scan(mode)//当mode=0的时候 单次扫描 mode=1 连扫
{static char key = 1;if (mode){key = 1;}if (key == 1 && (KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0)){key = 0;delay_10us(1000);if (KEY1 == 0)return KEY1_PRESS;else if (KEY2 == 0)return KEY2_PRESS;else if (KEY3 == 0)return KEY3_PRESS;else if (KEY4 == 0)return KEY4_PRESS;}else if (KEY1 == 1 && KEY2 == 1 && KEY3 == 1 && KEY4 == 1){key = 1;}return KEY_UNPRESS;
}
4. 联合(共用体)
4.1 联合类型的定义
联合是一种特殊的自定义类型,定义的变量也包含一系列的成员这些成员会共用一块内存空间。
union UN
{char c;int i;
};
int main()
{union UN un;printf("%d\n", sizeof(un));//4printf("%p\n", &un);//00EFFB08printf("%p\n", &(un.c));//00EFFB08printf("%p\n", &(un.c));//00EFFB08return 0;
}
三次取地址的结果是一样的,说明c和i的起始地址的是一样,可以得出,两个变量占用得空间开始是一样得,当然两个变量是不可以同时使用得,c占用4个字节的第一个字节,i占用四个字节,如图
4.2 联合的特点
联合的成员是共用同一块内存空间的,联合变量的大小至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。
int main()
{union Un{int i;char c;};union Un un;//下面输出的结果是什么?un.i = 0x11223344;un.c = 0x55;printf("%x\n", un.i);//11223355return 0;
}
un的前四个字节为11223344,后有将44修改为了55,因为VS2017上位小端存储。
可以封装成函数判断大小端存储:
#include<stdio.h>
int check_sys()
{union Un{int i;char c;}un;un.i = 1;return un.c;//判断变量,低位是否为1或者0
}
int main()
{int ret = check_sys();if (ret){printf("小端存储");}elseprintf("大端存储");return 0;
}
4.3 联合大小的计算
1.联合的大小至少是最大成员的大小。
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
int main()
{union Un1{char c[5];int i;};union Un2{short c[7];int i;};//下面输出的结果是什么?printf("%d\n", sizeof(union Un1));//8printf("%d\n", sizeof(union Un2));//16
}
Un1的内存大小为8
(1).c[5]的对齐数位1,占用5个字节的空间
(2).i的对齐数为4,占用内存4个字节的空间,
(3)最大对齐数为4,再取4的倍数,内存大小为8个字节;
Un2的内存大小为16
(1).c[7]的对齐数位2,占用14个字节的空间
(2).i的对齐数为4,占用内存4个字节的空间,
(3)最大对齐数为4,再取4的倍数,内存大小为16个字节;
相关文章:
C语言笔记(自定义类型:结构体、枚举、联合体 )
前言 本文对自定义类型的结构体创建、使用、结构体的存储方式和对齐方式,枚举的定义、使用方式以及联合体的定义、使用和存储方式展开叙述,如有错误,请各位指正。 目录 前言 1 结构体 1.1 结构体的声明 1.2 结构体的自引用 1.3 结构体变…...
【Golang】——Gin 框架与数据库集成详解
文章目录 1. 引言2. 初始化项目2.1 创建 Gin 项目2.2 安装依赖 3. 数据库驱动安装与配置3.1 配置数据库3.2 连接数据库3.3 在主函数中初始化数据库 4. 定义数据模型4.1 创建用户模型4.2 自动迁移 5. 使用 GORM 进行 CRUD 操作5.1 创建用户5.2 获取用户列表5.3 更新用户信息5.4 …...
nature communications论文 解读
题目《Transfer learning with graph neural networks for improved molecular property prediction in the multi-fidelity setting》 这篇文章主要讨论了如何在多保真数据环境(multi-fidelity setting)下,利用图神经网络(GNNs&…...
selinux及防火墙
selinux说明 SELinux 是 Security-Enhanced Linux 的缩写,意思是安全强化的 linux 。 SELinux 主要由美国国家安全局( NSA )开发,当初开发的目的是为了避免资源的误用。 httpd进程标签(/usr/share/nginx/html &#…...
实验二 系统响应及系统稳定性
实验目的 (1)学会运用Matlab 求解离散时间系统的零状态响应; (2)学会运用Matlab 求解离散时间系统的单位取样响应; (3)学会运用Matlab 求解离散时间系统的卷积和。 实验原理及实…...
【人工智能】深度学习入门:用TensorFlow实现多层感知器(MLP)模型
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 多层感知器(MLP)是一种基础的神经网络结构,广泛应用于分类和回归任务。作为深度学习的重要组成部分,理解并实现MLP是学习更复杂神经网络模型的基础。本文将介绍多层感知器的核心概念、数学原理,并使用…...
设计模式之建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,旨在将一个复杂对象的构建过程与其表示分离。它允许通过一步步地构造对象,而不需要暴露对象的内部细节和构建过程。通常,这个模式适用于创建对象时需要多个步骤&…...
谈一下开源生态对 AI人工智能大模型的促进作用
谈一下开源生态对 AI人工智能大模型的促进作用 作者:开源呼叫中心系统 FreeIPCC,Github地址:https://github.com/lihaiya/freeipcc 开源生态对大模型的促进作用是一个多维度且深远的话题,它不仅加速了技术创新的速度,…...
数据结构——树与二叉树
树 介绍 n个节点的有效集,它可为空树或非空树; 树是一种递归的结构。 对于非空树: 有且仅有一个称为根的节点。 除根节点以外其余节点可分为m个互不相交的有限集,且这些有限集本身也是一棵树,称为根的子树。 分等…...
神经网络(系统性学习三):多层感知机(MLP)
相关文章: 神经网络中常用的激活函数 神经网络(系统性学习一):入门篇 神经网络(系统性学习二):单层神经网络(感知机) 多层感知机(MLP) 多层感…...
Python学习——字符串操作方法
mystr “hello word goodbye” str “bye” Find函数:检测一个字符串中是否包含另一个字符串,找到了返回索引值,找不到了返回-1 print(mystr.find(str,0,len(mystr))) print(mystr.find(str,0,13)) index函数:检测一个字符串是否包含另一…...
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
css使用弹性盒,让每个子元素平均等分父元素的4/1大小 原本: ul {padding: 0;width: 100%;background-color: rgb(74, 80, 62);display: flex;justify-content: space-between;flex-wrap: wrap;li {/* 每个占4/1 */overflow: hidden;background-color: r…...
C语言练习.if.else语句.strstr
今天在做题之前,先介绍一下,新学到的库函数strstr 想要使用它,要先给它一个头文件<string.h> char *strstr(const char*str1,const char*str2); 首先:1.strstr的返回值是char,字符类型的。 2.两个实参ÿ…...
STM32编程小工具FlyMcu和STLINK Utility 《通俗易懂》破解
FlyMcu FlyMcu 模拟仿真软件是一款用于 STM32 芯片 ISP 串口烧录程序的专用工具,免费,且较为非常容易下手,好用便捷。 注意:STM32 芯片的 ISP 下载,只能使用串口1(USART1),对应的串口…...
拉格朗日乘子(Lagrange Multiplier)是数学分析中用于解决带有约束条件的优化问题的一种重要方法,特别是SVM
拉格朗日乘子(Lagrange Multiplier)是数学分析中用于解决带有约束条件的优化问题的一种重要方法,也称为拉格朗日乘数法。 例如之前博文写的2月7日 SVM&线性回归&逻辑回归在支持向量机(SVM)中,为了…...
计算机网络——数据链路层
计算机广域网如果采用多点连接的方式: 因为广域网的链路中带宽大,延迟大,很有可能发送碰撞导致数据错误 而且布局困难...
HTMLCSS:3D金字塔加载动画
效果演示 这段代码通过CSS3的3D变换和动画功能,创建了一个旋转的金字塔加载动画,每个侧面都有不同的颜色渐变,底部还有一个模糊的阴影效果,增加了视觉的立体感。 HTML <div class"pyramid-loader"><div cl…...
Charles抓包工具-笔记
摘要 概念: Charles是一款基于 HTTP 协议的代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果来达到分析抓包的目的。 功能: Charles 是一个功能全面的抓包工具,适用于各种网络调试和优化场景。 它…...
【Github】如何使用Git将本地项目上传到Github
【Github】如何使用Git将本地项目上传到Github 写在最前面1. 注册Github账号2. 安装Git工具配置用户名和邮箱仅为当前项目配置(可选) 3. 创建Github仓库4. 获取仓库地址5. 本地操作(1)进入项目文件夹(2)克隆…...
Express编写中间件
中间件 注意上面的调用next()。调用此函数会调用应用程序中的下一个中间件函数。该next()函数不是Node.js或Express API的一部分,而是传递给中间件函数的第三个参数。该next()函数可以命名为任何东西,但按照惯例,它总是被命名为“next”。为避…...
【Spring Boot】# 使用@Scheduled注解无法执行定时任务
1. 前言 在 Spring Boot中,使用Scheduled注解来定义定时任务时,定时任务不执行;或未在规定时间执行。 import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;Component public c…...
Java基于SpringBoot+Vue的藏区特产销售平台
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
_computed _destinations() 为什么模板不写()
_computed _destinations() 为什么模板不写() 在 Vue 模板中使用计算属性时,不需要在属性名称后面加上括号 ()。计算属性本质上是一个 getter 函数,但 Vue 会将其转换为一个响应式的属性。Vue 会自动调用这些计算属性并将其结果作为属性值使用。 计算属…...
接口上传视频和oss直传视频到阿里云组件
接口视频上传 <template><div class"component-upload-video"><el-uploadclass"avatar-uploader":action"uploadImgUrl":on-progress"uploadVideoProcess":on-success"handleUploadSuccess":limit"lim…...
SimbaSchema在数据云平台中的可观测性实践与应用
建立可观测性体系是很多数据部门的理想。从Logs、Metrics、Traces和Meta抓取系统状态,到建立数据模型和指标体系,全流程均通过数据来支持运维。建立可观测性体系具备其行业标准,即所有数据平台类基础设施理论上都应提供Infomation Schema可观…...
VB、VBS、VBA的区别及作用
VB、VBS 和 VBA 是三种与微软 Visual Basic 相关的编程语言或环境,它们在功能和用途上有所不同: # Visual Basic (VB) Visual Basic 是一种面向对象的编程语言,最初由微软公司开发。它是一种高级编程语言,旨在简化开发过程&…...
elasticsearch的文档管理
2 json数据入门 json数据类型 基础数据类型 字符串,只要用双引号包裹的都是字符串类型。“嘻嘻”,“文勇”,“2024” 数字型,2024,3.1415926 布尔型,true 和 false 空值,null 高级数据类…...
Java基础-I/O流
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 字节流 定义 说明 InputStream与OutputStream示意图 说明 InputStream的常用方法 说明 OutputStrea…...
【CVE-2024-9413】SCP-Firmware漏洞:安全通告
安全之安全(security)博客目录导读 目录 一、概述 二、修订历史 三、CVE根因分析 四、问题修复解决 一、概述 在SCP固件中发现了一个漏洞,如果利用该漏洞,可能会允许应用处理器(AP)在系统控制处理器(SCP)固件中导致缓冲区溢出。 CVE IDCVE-2024-9413受影响的产品SC…...
【iOS】知乎日报总结
知乎日报总结 前言详情页评论区tableView的自适应高度评论区的展开与收缩 收藏中心FMDB数据库数据库的使用 总结 前言 前五个礼拜完成了知乎日报的仿写,新学习了几个第三方库以及解决了一些网络异步的问题,本篇博客是对这个仿写项目的一些总结。两周前进…...
Python 使用 OpenCV 将 MP4 转换为 GIF图
以下是使用 Python 和 OpenCV 将 MP4 转换为 GIF 的示例代码: python import cv2 import imageiodef mp4_to_gif(mp4_path, gif_path, fps10, start_timeNone, end_timeNone):"""将MP4视频转换为GIF动图。:param mp4_path: 输入MP4视频的路径。:pa…...
学习路之phpstudy--安装mysql5.7后在my.ini文件中无法修改sql_mode
windows环境下使用phpstudy安装mysql5.7后需要修改mysql中的sql_mode配置,但是在phpstudy中打开mysql配置文件my.ini后, 通过查找找不到sql_mode或sql-mode, 此时无法在my.ini文件中直接进行修改,可以使用mysql命令进行修改&#…...
MySQL-学习笔记
基础篇 sql字段 1. date 类型 date类型用于存储日期值,格式为’YYYY-MM-DD’,显示范围是从’1000-01-01’到’9999-12-31’。它只包含日期部分,不包含时间部分。 2.datetime 类型 datetime类型用于存储日期和时间值,格式为’Y…...
HarmonyOS4+NEXT星河版入门与项目实战(19)------状态管理 @Prop@Link@Provide@Consume
文章目录 1、@Prop@Link@Provide@Consume装饰器图解2、案例演示1、模块划分2、模块封装1、任务统计模块2、列表管理模块3、主界面4、完整代码3、父组件是对象@Prop可以是对象属性1、案例改造2、完整代码4、@Provide@Consume案例1、案例改造2、完整代码3、总结1、@Prop@Link@Pro…...
企业OA管理系统:Spring Boot技术实现与案例研究
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了企业OA管理系统的开发全过程。通过分析企业OA管理系统管理的不足,创建了一个计算机管理企业OA管理系统的方案。文章介绍了企业OA管理系统的系统分析部…...
react
proTable manualRequest:实现初次进入不查询调用接口,当点击搜索调价查询才调用接口 form{{ ignoreRules: false }} 在搜索条件上增加必选项 formItemProps: { rules: [{required: true,message: 请选择结束时间}] },需要在proTable中增加form{{ ignoreRules: false }}才生效…...
【VTK】MFC中使用VTK9.3
MFC中如果使用VTK 碎碎念一、vtk环境配置二、具体实现1、新建类2. 自定义控件3、跑个栗子 总结 碎碎念 如果不是老程序用的MFC,我才不想用MFC去使用VTK呢。 一、vtk环境配置 关于环境配置你可以看这篇文章,在这里不过多赘述。需要注意要选择支持MFC&a…...
mysql系列1—mysql架构和协议介绍
背景: 本文开始整理mysql相关的文章,用于收集数据库相关内容;包括mysql架构和存储方式、索引结构和查询优化、数据库锁等内容。思考如何根据具体的业务给出最优的分表规划和表设计、字段选择和索引设计、优化的SQL语句,以及数据库…...
美创科技入选2024数字政府解决方案提供商TOP100!
11月19日,国内专业咨询机构DBC德本咨询发布“2024数字政府解决方案提供商TOP100”榜单。美创科技凭借在政府数据安全领域多年的项目经验、技术优势与创新能力,入选收录。 作为专业数据安全产品与服务提供商,美创科技一直致力于为政府、金融、…...
Vue——响应式数据,v-on,v-bind,v-if,v-for(内含项目实战)
目录 响应式数据 ref reactive 事件绑定指令 v-on v-on 鼠标监听事件 v-on 键盘监听事件 v-on 简写形式 属性动态化指令 v-bind iuput标签动态属性绑定 img标签动态属性绑定 b标签动态属性绑定 v-bind 简写形式 条件渲染指令 v-if 遍历指令 v-for 遍历对象的值 遍历…...
Vue实训---1-创建Vue3项目
0-在VSCode中的终端中运行npm -v查看版本号 如果出现——“npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。……”的错误,则需要在 vscode 终端执行 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 命令即可。…...
设计模式之观察者模式
背景 假如我们现在有这样一个场景:市场上的股票价格不定时变化,而后台监控者和广告想要实时获取股票信息,我们应该怎么做? 显然在这个场景里,我们有这样一个设计 一个股票类不时更新股票价格另外有两个类Monitor和Bi…...
Vue.js 学习总结(13)—— Vue3 version 计数介绍
前言 Vue3.5 提出了两个重要概念:version计数和双向链表,作为在内存和计算方面性能提升的最大功臣。既然都重要,那就单挑 version 计数来介绍,它在依赖追踪过程中,起到快速判断依赖项有没有更新的作用,所以…...
数据结构 ——— 直接选择排序算法的实现
目录 直接选择排序算法的思想 优化直接选择排序算法的思想 代码实现(默认升序) 直接选择排序算法的思想 直接选择排序算法的思想类似与直接插入排序 区别在于从大到小选择最小的元素或者最大的元素直接放在元素应该停留的位置每次从待排序的元素中选…...
初始Python篇(5)—— 集合
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: Python 目录 集合 相关概念 集合的创建与删除 集合的操作符 集合的相关操作方法 集合的遍历 集合生成式 列表、元组、字典、集合的…...
基于Qt/C++/Opencv实现的一个视频中二维码解析软件
本文详细讲解了如何利用 Qt 和 OpenCV 实现一个可从视频和图片中检测二维码的软件。代码实现了视频解码、多线程处理和界面更新等功能,是一个典型的跨线程图像处理项目。以下分模块对代码进行解析。 一、项目的整体结构 项目分为以下几部分: 主窗口 (M…...
图片生成视频-右进
右侧进入 ffmpeg -loop 1 -i image.jpg -f lavfi -i colorcblack:s1280x720:d20 -filter_complex "[1:v]formatrgba[bg];[0:v]formatrgba,scale1280:720[img];[bg][img]overlayxif(lt(t,3),W,if(lt(t,8),W-(t-3)*W/5,0)):y(H-h)/2:enablegte(t,3)" -c:v libx264 -t 2…...
Golang的语言特性与鸭子类型
Golang的语言特性与鸭子类型 前言 什么是鸭子类型? Suppose you see a bird walking around in a farm yard. This bird has no label that says ‘duck’. But the bird certainly looks like a duck. Also, he goes to the pond and you notice that he swims l…...
Spring Boot 3.x + OAuth 2.0:构建认证授权服务与资源服务器
Spring Boot 3.x OAuth 2.0:构建认证授权服务与资源服务器 前言 随着Spring Boot 3的发布,我们迎来了许多新特性和改进,其中包括对Spring Security和OAuth 2.0的更好支持。本文将详细介绍如何在Spring Boot 3.x版本中集成OAuth 2.0…...
Centos-stream 9,10 add repo
Centos-stream repo前言 Centos-stream 9,10更换在线阿里云创建一键更换repo 自动化脚本 华为centos-stream 源 , 阿里云centos-stream 源 华为epel 源 , 阿里云epel 源vim /centos9_10_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.h...