当前位置: 首页 > news >正文

14 结构体

结构体

结构体是什么?

在前面我们学习过基础的数据类型int float char 等,都只能用来表示基础的数据类型,那么要怎么来表示复杂的数据类型呢?

比如学生信息:

学号姓名性别年龄总分数
100maye18666
101椰汁19555

在这里插入图片描述在这里插入图片描述

定义5个数组,然后每个数组的长度都一致是否可行?

int ids[N]={0};
char names[N][10]={0};
char sexs[N][3]={0};
int ages[N]={0};
int scores[N]={0};

看起来还不错,实际上有很多同学也是这么做的,在没有学习结构体之前这样还是不错的,从这节课开始有更好的方法来处理哦~

既然学生信息有很多,那么能不能定义一个学生类型呢?如果能,直接通过学生访问该学生的所有信息就很方便了!

答案是能!!

**数组:**可存储相同数据类型的变量。

**结构体:**用户自定义的数据类型,它允许存储不同类型的数据项。(数据项被称为"成员")

结构体的申明

为了定义结构体,您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:

struct tag
{member1;member2;member3;...
}
  • tag 是结构体标签;
  • member 是标准的变量定义,比如int i;char c;或者其他有效的变量定义。
  • 多个成员之间用分号分隔(不允许0成员结构体的定义)
  • 末尾的分号不可缺少。

那么对于上面的学生的信息,就可以用如下结构体表示学生结构体类型:

struct Student	//学生结构体类型
{int id;			//学号char name[10];	//姓名char sex;		//性别int age;		//年龄int score;		//总分
}

在这里插入图片描述

结构体变量定义

结构体类型已经声明,如何使用结构体类型定义结构体变量呢?有三种方法:

  1. 先声明结构体类型再定义结构体变量
struct Student maye;
  1. 在声明结构体类型的同时定义变量
struct Student
{...
}maye;
  1. typedef取别名之后再定义变量
typedef struct Student
{    ...
}Student;	//加了typedef之后,这里的Student就是struct Student 的别名了
Student maye;
  • 通过第一种方法定义结构体变量时,struct关键字不能省略。

结构体变量初始化

在定义结构体变量的同时通过{}的方式为每一个成员变量进行赋初值

  • 全部初始化
struct Student maye = {100,"maye",1,18,666};
  • 部分初始化:未初始化部分自动初始化为0
struct Student maye = {100};
  • 全部初始化为0
struct Student maye = {0};
  • 初始化指定的成员(可以初始化任意成员,不必遵循定义顺序)
struct Student maye = {.id = 100,.age = 18};
  • 用另一个结构体变量初始化:
struct Student zc = maye;
zc = (struct Student){200"zc"};
  • 和数组初始化一样,只能从左边开始逐个初始化,不能跳过
  • 初始化时,类型及顺序要一一对应

结构体变量的使用

要通过结构体变量访问成员,就需要用到成员访问运算符(. 或 ->)~

  • 普通结构体变量访问成员使用 .
struct Student hero = {007,"007特工"};
puts(hero.name);
  • 通过结构体指针访问成员使用 ->
struct Student *ph = &hero;
(*ph).name;
ph->name;

结构体嵌套

在一个结构体内包含另一个结构体作为其成员,有两种写法。

比如,给学生增加一个出生日期,包含年月日.

  1. 先定义好结构体,然后在另一个结构体中定义结构体变量
struct Date
{short year;short month;short day;
};struct Student
{int id;char name[10];struct Date birth;	//出生日期
};
  1. 直接把结构体定义在另一个结构体内。
struct Student
{int id;char name[10];struct Date{short year;short month;short day;}birth;//出生日期
};
  • 当出现结构体嵌套时,必须以级联方式访问结构体成员,即通过成员访问运算符逐级找到最底层的成员。
struct Student maye;
maye.birth.year = 2022;
maye.birth.month = 2;
maye.birth.day = 9;struct Student zc = {2000,"顽石",{2021,5,14}};

结构体数组

一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗?

很明显不可能,这时就要使用数组。结构体中也有数组,称为结构体数组。它与前面讲的数值型数组几乎是一模一样的,只不过需要注意的是,结构体数组的每一个元素都是一个结构体类型的变量,都包含结构体中所有的成员项。

struct Student stus[10];

这就定义了一个结构体数组,共有 10 个元素,每个元素都是一个结构体变量,都包含所有的结构体成员。

下面编写一个程序,编程要求:从键盘输入 5 个学生的基本信息,如学号、姓名、年龄、性别,然后将年龄最大的学生的基本信息输出到屏幕。

#include <stdio.h>struct Student
{int id;char name[10];int age;char sex;
};
/*
1001 小红 22 F
1002 小明 21 M
1003 小欣 23 F
1004 小天 20 F
1005 小黑 19 M
*/int main()
{struct Student stus[10];for (int i = 0; i < 5; i++){printf("input %d stu>",i+1);scanf("%d %s %d %c",&stus[i].id,stus[i].name,&stus[i].age,&stus[i].sex);}struct Student maxStu = stus[0];for (int i = 0; i < 5; i++){if (maxStu.age < stus[i].age){maxStu = stus[i];}         }printf("%d %s %d %c\n", maxStu.id,maxStu.name, maxStu.age, maxStu.sex);return 0;
}

input 1 stu>1001 小红 22 F
input 2 stu>1002 小明 21 M
input 3 stu>1003 小欣 23 F
input 4 stu>1004 小天 20 F
input 5 stu>1005 小黑 19 M
1003 小欣 23 F

结构体数组也是能够初始化的,我们将上面的程序修改一下:

int main()
{struct Student stus[10] = {{1001, "小红", 22, 'F'},{1002,"小明" ,21,' M'},{1003,"小欣" ,23, 'F'},{1004, "小天", 20, 'F'},{1005, "小黑", 19, 'M'}};struct Student maxStu = stus[0];for (int i = 0; i < 5; i++){if (maxStu.age < stus[i].age){maxStu = stus[i];}         }printf("%d %s %d %c\n", maxStu.id,maxStu.name, maxStu.age, maxStu.sex);return 0;
}

结构体字节对齐

每种类型在定义对象时,都会开辟内存,类型不同所占内存大小也不一样,用sizeof即可获取类型大小。

思考:结构体占用的内存大小是多少呢?

  • 是成员所占内存的总和吗?
  • 还是有其他的处理方式?

先来看几个例子吧:

#include<stdio.h>struct Node
{int a;int b;
};int main()
{printf("%d\n",sizeof(struct Node));return 0;
}
struct Node
{int a;int b;
};	//8

这个结构体大小为8个字节,看起来是成员大小的总和,实际上这只是个巧合:当成员类型全部一样时,结构体大小就等于每个成员大小之和。

struct Node1
{int a;char b;
};	//8

这个结构体大小还是8个字节,为什么?这实际上是编译器对结构体的空间进行了优化,就是所谓的字节对齐。

什么是字节对齐?

从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。

为什么要字节对齐?

原因:

  • 某些平台只能在特定的地址处访问特定类型的数据;

  • 提高存取数据的速度。比如有的平台每次都是从偶地址处读取数据,对于一个int型的变量,若从偶地址单元处存放,则只需一个读取周期即可读取该变量;但是若从奇地址单元处存放,则需要2个读取周期读取该变量。

字节对齐规则

C语言标准并没有规定内存对齐的细节,而是交给具体的编译器去实现,但是对齐的基本原则是一样的。

    1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
    1. 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
  • 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

位段(位域)

位段是什么?

C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为位段。利用位段能够用较少的位数存储数据。

语法:

struct 结构体名
{整数类型 位段名1 : 位段大小;整数类型 位段名2 : 位段大小;整数类型 位段名3 : 位段大小;整数类型 位段名4 : 位段大小;...
};
  • 整数类型:C语言标准规定,只有有限的几种数据类型可以用于位段。(所有整数类型以及char类型和_Bool类型)。
  • 位段名:即有效的标识符
  • 位段大小:此位段所占的位数,不能超过类型的最大位数。

范例:

struct BitField
{unsigned char a:1;unsigned char b:4;unsigned char c:3;
};
int main()
{//初始化struct BitField bit={1,2,3};//输出printf("first:%d %d %d\n",bit.a,bit.b,bit.c);//赋值bit.a = 2;bit.b = 20;bit.c = 8;//再次输出printf("last:%d %d %d\n",bit.a,bit.b,bit.c);
}

运行结果:

fast:1 2 3
last:0 4 0

第一次的输出结果都是完整的,第二次输出的结果令人摸不着头脑。

  • **第一次输出时:**a、b、c的值分别为1、2、3,转换成二进制分别是0b1、0b10、0b11,都没有超出限定的位数,能正常输出。

  • **第二次输出时:**a、b、c的值分别为2、20、8,转换成二进制分别是0b10、0b10100、0b1000,所有位段都超出了限定的位数,不能正常输出。

    • 超出部分被直接截去(从高位开始截断,即从左往右),截去之后的二进制分别为0b0、0b0100、0b000,换算成十进制分别为0、4、0

注意事项

1、**位段的内存分配:**位段占的二进制位数不能超过该基本类型所能表示的最大位数,即位段不能跨字节存储,比如char是占1个字节,那么最多只能是8位;

struct Bit
{char a:3;	//rightchar b:9;	//error C2034: “d”: 位域类型对位数太小
};

2、**位域的存储:**C语言标准并没有规定位域的具体存储方式,不同的编译器有不同的实现,但它们都尽量压缩存储空间。

当相邻成员的类型相同时,如果它们的位宽之和小于类型的 sizeof 大小,那么后面的成员紧邻前一个成员存储,直到不能容纳为止;如果它们的位宽之和大于类型的 sizeof 大小,那么后面的成员将从新的存储单元开始,其偏移量为类型大小的整数倍。

struct Bf1
{char a:3:char b:3;
};
//sizeof(struct Bf1) == 1struct Bf2
{char a:3:char b:3;char c:3;
};
//sizeof(struct Bf2) == 2

3、禁止对位段取地址:地址是字节(Byte)的编号,而不是位(Bit)的编号。

&bit.a;		//error C2104: 位域上的“&”被忽略

4、**无名位段:**位域成员可以没有名称,只给出数据类型和位宽

struct Bf
{int a:12;int :20;int b:4;
};

无名位域一般用来作填充或者调整成员位置。因为没有名称,无名位域不能使用。

上面的例子中,如果没有位宽为 20 的无名成员,a、b 将会挨着存储,sizeof(struct Bf) 的结果为 4;有了这 20 位作为填充,a、b 将分开存储,sizeof(struct Bf) 的结果为 8。

联合

联合也是一种数据类型,用户可自定义。不同于结构体成员——它们在结构中都具有单独的内存位置,联合成员则共享同一个内存位置。也就是说,联合中的所有成员都是从相同的内存地址开始。因此,可以定义一个拥有许多成员的联合,但是同一时刻只能有一个成员允许含有一个值。联合让程序员可以方便地通过不同方式使用同一个内存位置。

联合的定义

联合的定义方式与结构是一样的,只是把关键字 struct 改成 union:

union tag
{member;...
};

下面的例子定义了一个名为Data的联合类型,它有 3 个成员:i、x 和 str:

union Data
{int i;double x;char str[16];
};

这种类型的对象可以存储一个整数、一个浮点数或一个短字符串。如果想获得联合的空间大小,可以使用 sizeof 运算符。对上例来说,sizeof(union Data)会返回 16。

如下图所示:联合中所有成员都是从内存中同一个地址开始的。

img

为展示联合和结构的差异,看看下面定义的 struct Record,它具有成员 i、x 和 str:

struct Record
{int i;double x;char str[16];
};

如下图所示:结构对象中每个成员使用内存中的不同位置。

img

获取联合成员的方式和获取结构成员的方式一样。唯一的差异在于,当改变一个联合成员的值时,实际上修改了该联合所有成员的值。

程序员要确保联合对象的内存内容被正确地解释和使用。联合内成员的类型不同,允许程序员采用不同的方式解释内存中的同一组字节值。例如,下面的循环使用联合来展示一个 double 值在内存中的存储形式:

union Data var;
var.x = 3.14;
for(int i = sizeof(double)-1;i>=0;i--)
{printf("%02X ",(unsigned char)var.str[i]);
}

该循环从 var.x 的最高位字节开始,生成下面的输出:

3F F4 00 00 00 00 00 00

联合的初始化

与结构类似,通过初始化列表(initialization list)来初始化联合对象。但是,对联合来说,列表只有一个初始化器(initializer)。

与结构一样,C99 允许在初始化器中使用成员指示符来指示哪个成员被初始化。而且,如果初始化器没有成员指示符,那么就与联合内的第一个成员关联。具有自动存储类的联合对象也可以使用已有的同类型对象来初始化。下面是一些初始化例子:

union Data var1 = { 77 };
union Data var2 = { .str = "Mary" };
union Data var3 = var1;

枚举

枚举:具有有限个整型符号常量的集合,这些整型符号常量称为枚举常量。

枚举的定义很简单,和结构体差不多,只需要把关键字 struct 改成 enum:

enum tag
{member;...
};

枚举类型有什么用?

  • 在实际应用中,有些变量的取值范围是有限的,仅可能只有几个值,如一个星期7天, 一年12个月,一副扑克有4种花色,每一花色有13张牌等。
  • 整型数来表示:直观性差,如1,在别让看来可能就是数字1,或者星期一,或者一月份,难以区分!
  • 由此看出,为提高程序的可读性,引入非数值量即一些有意义的符号是非常必要的。
enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };

判断用户输入的是星期几:

#include <stdio.h>
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
int main()
{scanf("%d", &day);switch(day){case Mon: puts("Monday"); break;case Tues: puts("Tuesday"); break;case Wed: puts("Wednesday"); break;case Thurs: puts("Thursday"); break;case Fri: puts("Friday"); break;case Sat: puts("Saturday"); break;case Sun: puts("Sunday"); break;default: puts("Error!");}return 0;
}

有意义的符号是非常必要的。

enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };

判断用户输入的是星期几:

#include <stdio.h>
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
int main()
{scanf("%d", &day);switch(day){case Mon: puts("Monday"); break;case Tues: puts("Tuesday"); break;case Wed: puts("Wednesday"); break;case Thurs: puts("Thursday"); break;case Fri: puts("Friday"); break;case Sat: puts("Saturday"); break;case Sun: puts("Sunday"); break;default: puts("Error!");}return 0;
}

相关文章:

14 结构体

结构体 结构体是什么&#xff1f; 在前面我们学习过基础的数据类型int float char 等&#xff0c;都只能用来表示基础的数据类型&#xff0c;那么要怎么来表示复杂的数据类型呢&#xff1f; 比如学生信息&#xff1a; 学号姓名性别年龄总分数100maye男18666101椰汁女19555 …...

如何配置 Docker 以实现无需 sudo 使用

1. 背景知识&#xff1a;为什么需要 sudo&#xff1f; Docker 是一个容器化平台&#xff0c;其核心组件包括&#xff1a; Docker 守护进程&#xff08;dockerd&#xff09;&#xff1a;负责管理容器的创建、运行和销毁。Docker CLI&#xff1a;用户通过命令行工具&#xff08…...

嵌入式开发之STM32学习笔记day06

基于STM32F103C8T6的开发实践——从入门到精通01 1. 引言 STM32系列微控制器是STMicroelectronics推出的一款高性能、低功耗的32位微控制器&#xff0c;广泛应用于嵌入式系统中。STM32F103C8T6是其中非常受欢迎的一款&#xff0c;凭借其强大的性能、丰富的外设接口和低廉的价格…...

openocd C#桌面工具

文章目录 简介一、主界面二、文件列表三、rtl介绍四、虚拟示波器1、画线2、画点3、合并显示4、测试代码简介 基于廉价9.9包邮的DAP-Link,在IAR和Keil中下载和调试都没毛病。 可是不能单独使用。单独烧录固件用不了,也不能同jlink一样打印日志和显示波形。 openocd开源工具能…...

goland小问题报错及解决

报错信息&#xff1a; cannot use rw (variable of type *populateResponse) as ResponseWriter value in argument to t.fh.ServeHTTP: *populateResponse does not implement ResponseWriter (missing method Fprintf) cannot use rw (variable of type *http2responseWrite…...

AtCoder Beginner Contest 397 A - D题解

Tasks - OMRON Corporation Programming Contest 2025 (AtCoder Beginner Contest 397) 本文为 AtCoder Beginner Contest 397 A - D题解 题目A: 代码(C): #include <bits/stdc.h>int main() {double n;std::cin >> n;if (n > 38.0) {std::cout << 1;}…...

18年老牌软件,完美解锁pro!

很多小伙伴在学习、工作中都喜欢使用思维导图来整理和记录自己的思路&#xff0c;通过图形化的方式展示复杂概念和关系&#xff0c;使信息更加清晰易懂&#xff0c;有助于理解和记忆&#xff1b;其次&#xff0c;分层次和分类别的信息结构也能够快速理清思路&#xff0c;突出重…...

Power Apps 技术分享:画布应用使用表单控件

前言 表单控件&#xff0c;是画布应用里一个非常好用的控件&#xff0c;我们今天简单介绍下&#xff0c;如何使用这个控件。 正文 1.首先&#xff0c;我们需要有一个数据源&#xff0c;我们这里用上一篇博客新建的数据源&#xff0c;如下图&#xff1a; 2.新建一个页面&#xf…...

视频转音频, 音频转文字

Ubuntu 24 环境准备 # 系统级依赖 sudo apt update && sudo apt install -y ffmpeg python3-venv git build-essential python3-dev# Python虚拟环境 python3 -m venv ~/ai_summary source ~/ai_summary/bin/activate核心工具链 工具用途安装命令Whisper语音识别pip …...

ZLMediaKit源码分析——[1] 开篇:onceToken源码分析

系列文章目录 第一篇 基于SRS 的 WebRTC 环境搭建 第二篇 基于SRS 实现RTSP接入与WebRTC播放 第三篇 centos下基于ZLMediaKit 的WebRTC 环境搭建 第四篇 WebRTC学习一:获取音频和视频设备 第五篇 WebRTC学习二:WebRTC音视频数据采集 第六篇 WebRTC学习三:WebRTC音视频约束 …...

EasyRTC嵌入式音视频通话SDK:微信生态支持、轻量化架构与跨平台兼容性(Linix/Windows/ARM/Android/iOS/LiteOS)

随着WebRTC技术的不断发展&#xff0c;实时音视频通信在各个领域的应用越来越广泛。EasyRTC嵌入式音视频通话SDK作为一款基于WebRTC技术的实时通信解决方案&#xff0c;凭借其强大的功能和灵活的集成能力&#xff0c;受到了越来越多开发者的关注。 一、系统架构设计 纯C语言开…...

Python中使用vlc库实现视频播放功能

文章目录 前言1. 环境准备1.1Python安装1.2选择Python开发环境1.3安装必要库 2. 基础播放示例3. 常用播放控制功能4. 事件监听5. 播放网络流媒体6. 结合 GUI 库制作视频播放器&#xff08;以 Tkinter 为例&#xff09; 前言 本教程主要包含打开文件、播放和停止按钮&#xff0…...

Elasticsearch面试题

以下是150道Elasticsearch面试题及其详细回答&#xff0c;涵盖了Elasticsearch的基础知识、配置与优化、查询操作、集群管理、性能调优等多个方面&#xff0c;每道题目都尽量详细且简单易懂&#xff1a; Elasticsearch基础概念类 1. 什么是Elasticsearch&#xff1f; Elastics…...

Linux上位机开发实战(qt编译之谜)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多同学都喜欢用IDE&#xff0c;也能理解。因为不管是visual studio qt插件&#xff0c;还是qt creator其实都帮我们做了很多额外的工作。这里面最…...

SpringBoot3+Druid+MybatisPlus多数据源支持,通过@DS注解配置Service/Mapper/Entity使用什么数据源

在 Spring Boot 3 中结合 Druid 和 MyBatis-Plus 实现多数据源支持&#xff0c;并通过 DS 注解动态切换数据源&#xff0c;可以按照以下步骤进行配置&#xff1a; 官方文档&#xff1a;多数据源支持 | MyBatis-Plus 1. 引入依赖 在 pom.xml 中添加以下依赖&#xff1a; <…...

Java学习------内部类

1. 定义 定义在一个类中的类 2. 使用时机 当一个类需要用到另一个类&#xff0c;并且两个类的联系比较密切时就需要使用内部类内部类可以访问外部类的私有成员&#xff0c;这样可以将相关的类和接口隐藏在外部类的内部&#xff0c;提高封装性匿名内部类是没有名字的类&#…...

【QA】建造者模式在Qt有哪些应用

#设计模式 #Qt 一、QDomDocument&#xff08;XML 文档构建&#xff09; 模式角色&#xff1a; Builder&#xff1a;QDomDocument 本身Product&#xff1a;XML 文档对象Director&#xff1a;用户代码通过 QDomDocument 逐步构建文档结构 示例代码&#xff1a; QDomDocument…...

uniapp 多环境配置打包,比较优雅的解决方案,全网相对优解

uniapp 多环境配置打包&#xff0c;比较优雅的解决方案&#xff0c;全网相对优解 读取.env.[development|test|staging|production]配置文件进行打包&#xff0c;最终效果如下图可以看到多个环境&#xff0c; 并且我们可以自定义更多的环境配置 前言 由于uniapp的hbuilder开发…...

【量化科普】Liquidity,流动性

【量化科普】Liquidity&#xff0c;流动性 &#x1f680;量化软件开通 &#x1f680;量化实战教程 在金融市场中&#xff0c;流动性&#xff08;Liquidity&#xff09;是一个至关重要的概念。它指的是资产能够以多快的速度被买入或卖出而不显著影响其价格的能力。高流动性的…...

qt介绍图表 charts 一

qt chartsj基于Q的Graphics View框架&#xff0c;其核心组件是QChartView和QChart.QChartView是一个显示图表的独立部件&#xff0c;基类为QGraphicsView.QChar类管理图表的序列&#xff0c;图例和轴示意图。 绘制一个cos和sin曲线图&#xff0c;效果如下 实现代码 #include…...

如何图像去噪?(一)

喜欢可以在我的主页订阅专栏哟&#xff0c;至少更新6年~~&#xff0c;更到我上大学也可能会继续更~~ 第一章 图像去噪的基础知识与核心概念 1.1 图像噪声的数学模型与物理成因 定义扩展&#xff1a; 图像噪声是信号采集、传输或存储过程中引入的随机干扰&#xff0c;其本质为…...

【数据库】Data Model(数据模型)数据模型分析

理解图片中的 Data Model&#xff08;数据模型&#xff09;是学习数据库设计和应用程序开发的重要一步。作为初学者&#xff0c;你可以通过比喻和简单的解释来理解这些概念以及它们之间的联系。以下是对图片中数据模型的详细分析&#xff0c;以及如何理解它们之间的关系。 1. 数…...

win10 c++ VsCode 配置PCL open3d并显示

win10 c VsCode配置PCL open3d并显示 一、效果图二、配置步骤2.1 安装vscode2.2 pcl-open3d配置2.3 vscode中设置 三、测试代码四、注意事项及后续 一、效果图 二、配置步骤 2.1 安装vscode vscode下载链接 下载中文插件、c相关插件 2.2 pcl-open3d配置 1&#xff09;下载…...

Flask多参数模版使用

需要建立目录templates&#xff1b; 把建好的html文件放到templates目录里面&#xff1b; 约定好参数名字&#xff0c;单个名字可以直接使用&#xff1b;多参数使用字典传递&#xff1b; 样例&#xff1a; from flask import render_template # 模板 (Templates) #Flask 使用…...

python中a is None 和 a==None有区别吗

在 Python 中&#xff0c;a is None 和 a None 的区别如下&#xff1a; 1. a is None 这是身份&#xff08;identity&#xff09;比较&#xff0c;用于检查 a 是否就是 None 这个对象。None 是 Python 的单例对象&#xff0c;意味着在 Python 运行过程中&#xff0c;所有 No…...

Excel(函数篇):COUNTIF与CONUTIFS函数、SUMIF与SUMIFS函数、ROUND函数、MATCH与INDEX函数、混合引用与条件格式

目录 COUNTIF和COUNTIFS函数COUNTIF函数COUNTIFS函数SUMIF和SUMIFS函数SUMIF函数SUMIFS函数SUMIFS函数与控件实现动态年月汇总ROUND、ROUNDUP、ROUNDDOWN函数单元格混合引用条件格式与公式,标记整行数据MATCH和INDEX函数COUNTIF和COUNTIFS函数 COUNTIF函数 统计下“苏州”出现…...

C语言及内核开发中的回调机制与设计模式分析

在C语言以及操作系统内核开发中,回调机制是一种至关重要的编程模式。它通过注册框架和定义回调函数,实现了模块间的解耦和灵活交互,为系统的扩展性和可维护性提供了有力支持。本文将深入探讨这种机制的工作原理、应用场景以及与设计模式的关联。 一、回调机制的核心概念 (…...

SAP WORKFLOW BUSINESS PROCESS AUTOMATION

SAP WORKFLOW BUSINESS PROCESS AUTOMATION...

它,让机器人与HMI屏无缝对接

随着工业自动化向智能化发展&#xff0c;机器人与HMI屏的通信变得至关重要。本文将为您介绍一款创新的解决方案&#xff0c;它打破了通信协议的壁垒&#xff0c;实现机器人与HMI屏的无缝连接。 随着工业自动化向智能化的迈进&#xff0c;生产制造业正加速引入大量工业机器人以替…...

Vala语言基础知识-源文件和编译

源文件和编译 Vala代码‌以.vala为扩展名。与Java等语言不同&#xff0c;Vala‌不强制要求严格的文件结构‌——它没有类似Java的"包"&#xff08;package&#xff09;或"类文件"&#xff08;class file&#xff09;的概念&#xff0c;而是通过文件内的文本…...

《mc百科》小引

现在的年轻人&#xff0c;不是玩农药&#xff0c;就是在打和平&#xff0c;几乎每到街上&#xff0c;想就看见农药上号的&#xff0c;但这些游戏&#xff0c;虽然宜人&#xff0c;但随时都能让人异化。 但有一种游戏&#xff0c;可以说几乎涵盖了所有文化。早其自由度高达999%…...

java泛型通配符?及上下界(extends,super)保证安全性、灵活性、可读性

在 Java 中&#xff0c;泛型通配符&#xff08;?&#xff09;用于表示未知类型&#xff0c;通常用于增强泛型的灵活性。通配符可以与上下限结合使用&#xff0c;以限制泛型的范围。以下是通配符及上下限的使用示例&#xff1a; 1. 无界通配符 (?) 无界通配符表示可以接受任意…...

PyQt6内嵌http.server Web 和Flask Web服务器方法详解

PyQt6 可以内嵌一个简单的 Web 服务器。虽然 PyQt6 本身不提供直接的 Web 服务器功能&#xff0c;但可以结合 Python 的标准库&#xff08;如 http.server&#xff09;或其他 Web 框架&#xff08;如 Flask、FastAPI 等&#xff09;来实现。 示例&#xff1a;使用 http.server…...

【ProjectDiscovery 生态中核心工具 Subfinder、Httpx、Katana 和 Nuclei 的基础使用教程】

ProjectDiscovery 生态中核心工具 Subfinder、Httpx、Katana 和 Nuclei 的基础使用教程 一、Subfinder&#xff1a;子域名发现工具安装基础使用 二、Httpx&#xff1a;HTTP 探测与指纹识别安装基础使用 三、Katana&#xff1a;网络爬虫工具安装基础使用 四、Nuclei&#xff1a;…...

【Linux系统】进程地址空间详解

Linux系列 文章目录 Linux系列前言一、地址空间的区域划分二、进程地址空间的引入2.1 地址空间的概念2.2 地址空间2.3 进程地址空间的优点 三、页表3.1 区域权限管理3.2 惰性加载 总结 前言 进程地址空间是操作系统为每个运行中的进程分配的一个虚拟内存视图&#xff0c;它是所…...

使用Dependency Walker和Beyond Compare快速排查dll动态库损坏或被篡改的问题

目录 1、问题描述 2、用Dependency Walker工具打开qr.dll库&#xff0c;查看库与库的依赖关系以及接口调用情况&#xff0c;定位问题 3、使用Beyond Compare工具比较一下正常的msvcr100d.dll和问题msvcr100d.dll的差异 4、最后 C软件异常排查从入门到精通系列教程&#xff…...

蓝桥杯 刷题统计

问题描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题? 输入格式 输入一行包含三个整数 a,b和 n. 输出格式 输出一个整数代表天数。 样…...

019-RSA

RSA 一、RSA技术原理与流程&#xff08;附流程图&#xff09; 密钥生成流程 graph TDA[选择大质数p/q] --> B[计算np*q]B --> C[计算 “φ&#xff08;n&#xff09;p-1*q-1”]C --> D[选择e与φ&#xff08;n&#xff09;互质]D --> E[计算d满足ed≡1 mod φ&am…...

《 C++ 点滴漫谈: 三十一 》函数重载不再复杂:C++ 高效调试与性能优化实战

摘要 本篇博客深入探讨了 C 中的函数重载及其调试技巧。首先&#xff0c;介绍了函数重载的基本概念及其在 C 编程中的应用&#xff0c;强调了如何通过函数重载提高代码的灵活性和可读性。接着&#xff0c;我们讨论了函数重载的常见问题&#xff0c;如二义性、隐式类型转换和重…...

2024年消费者权益数据分析

&#x1f4c5; 2024年315消费者权益数据分析 数据见&#xff1a;https://mp.weixin.qq.com/s/eV5GoionxhGpw7PunhOVnQ 一、引言 在数字化时代&#xff0c;消费者维权数据对于市场监管、商家诚信和行业发展具有重要价值。本文基于 2024年315平台线上投诉数据&#xff0c;采用数…...

uniapp APP权限弹框

效果图 第一步 新建一个页面&#xff0c;设置透明 {"path": "pages/permissionDisc/permissionDisc","style": {"navigationBarTitleText": "","navigationStyle": "custom","app-plus": {&…...

【Weaviate】数据库:向量存储与搜索的新纪元

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是Weaviate 2、Weaviate 能做什么&#xff1f; …...

机器学习之激活函数

什么是激活函数 激活函数是神经网络的关键组件&#xff0c;作用于神经元输出。神经元汇总输入并计算净输入值&#xff0c;激活函数将其非线性变换&#xff0c;生成神经元最终输出&#xff0c;该输出作为后续神经元输入在网络中传播。 为什么需要激活函数 引入非线性 无激活…...

ACWing:178. 第K短路 (A*算法)

178. 第K短路 - AcWing题库 ac代码&#xff1a; #include<iostream> #include<cstring> #include<queue> using namespace std; const int N1010; const int M20020; struct node{int d,end,d1;bool operator <(const node &x)const{return d>x.d…...

Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(一)

WDDM 3.0 之前的翻转队列模型 许多新式显示控制器支持对按顺序显示的多个帧排队的能力。 从 WDDM 2.1 开始&#xff0c;OS 支持将在下一个 VSync 中显示的多个未完成的翻转覆盖请求。 显示微型端口驱动程序 (KMD) 通过 DXGK_DRIVERCAPS 中的 MaxQueuedMultiPlaneOverlayFlipVS…...

本地仓库设置

将代码仓库初始化为远程仓库&#xff0c;主要涉及在服务器上搭建 Git 服务&#xff0c;并将本地代码推送到服务器上。以下是详细的步骤&#xff1a; 1. 选择服务器 首先&#xff0c;你需要一台服务器作为代码托管的远程仓库。服务器可以是本地服务器、云服务器&#xff0c;甚…...

openEuler系统迁移 Docker 数据目录到 /home,解决Docker 临时文件占用大问题

根据错误信息 write /var/lib/docker/tmp/...: no space left on device&#xff0c;问题的根源是 根分区&#xff08;/&#xff09;的磁盘空间不足&#xff0c;而非 /home 分区的问题。以下是详细解释和解决方案&#xff1a; 问题原因分析 Docker 临时文件占用根分区空间&…...

LoRA有哪些 参数高效微调方法?

LoRA有哪些 参数高效微调方法? 目录 LoRA有哪些 参数高效微调方法?一、**Fisher 信息矩阵(FIM)近似方差**公式原理LoRA 应用示例二、**动态梯度方差(指数加权移动平均)**公式原理LoRA 代码示例三、**分层梯度方差(结构稀疏性)**公式原理案例:文本分类任务四、**局部方…...

【Xinference rerank】学习如何在Xinference中使用重新排序模型

xinferance 官方网站 给定一个查询和一系列文档&#xff0c;Rerank 会根据与查询的语义相关性从最相关到最不相关对文档进行重新排序。在 Xinference 中&#xff0c;可以通过 Rerank 端点调用 Rerank 模型来对一系列文档进行排序。 from xinference.client import Clientclie…...

pyqt 上传文件或者文件夹打包压缩文件并添加密码并将密码和目标文件信息保存在json文件

一、完整代码实现 import sys import os import json import pyzipper from datetime import datetime from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout,QPushButton, QLineEdit, QLabel, QFileDialog,QMessageBox, QProgressBar) from PyQt5.…...