Unity学习笔记(零基础到就业)|Chapter02:C#基础
Unity学习笔记(零基础到就业)|Chapter02:C#基础
- 前言
- 一、复杂数据(变量)类型part01:枚举+数组
- 1.特点
- 2.枚举
- (1)基本概念
- (2)申明枚举变量
- (3)枚举的类型转换
- 3.一维数组
- (1)数组的声明(5种方式)
- (2)数组的使用
- 4.二维数组
- (1)声明二维数组变量(类似一维数组)
- (2)二维数组的使用
- 5.交错数组(非重点知识,了解就好)
- (1)交错数组的声明
- (2)交错数组的使用
- 6.补充:关于数组的常见考题
- (1)数组和List的区别
- (2)数组参数是什么
- 二、值类型和引用类型
- 1.存储和使用上的区别
- 2.特殊的引用类型:String
- 3.补充:常见考题
- (1)String和StringBuilder的区别
- (2)深拷贝和浅拷贝
- 三、函数(方法)
- 1.函数基础
- (1)基本概念
- (2)函数写的位置
- (3)基本语法
- (4)实际运用
- (5)关于return
- 2.ref和out:函数参数的修饰符
- (1)使用ref和out的原因
- (2)ref和out的使用及区别
- 3.变长参数和参数默认值
- (1)变长参数关键字:params
- (2)参数默认值
- 4.函数重载
- (1)基本概念
- (2)作用
- (3)实例
- 5.递归函数
- 四、复杂数据(变量)类型——结构体
- 1.基本概念与作用
- 2.基本语法
- 3.实例
- 4.结构体的构造函数
- (1)基本概念与作用
- (2)实例
前言
这系列的学习笔记主要是根据唐老狮的unity实战路线课程整理的,加入了自己的一些补充和理解,该课程涉及的知识内容非常多,我并未学完,而是根据就业需求挑选学习的,也对后续框架部分进行了一些修改,希望能通过整理并时常阅读这些笔记巩固开发知识,也希望能跟在学习unity的小伙伴一起分享、探讨,笔记中有疑问或出错的部分也希望大佬们能够给予指导鸭~🙏
一、复杂数据(变量)类型part01:枚举+数组
1.特点
一般是多个数据(变量)集合在一起的,并且一般可以自己取名字自定义。
枚举:整形常量的集合
数组:任意变量类型顺序存储的数据集合
结构体:任意变量的数据集合,可自定义
2.枚举
(1)基本概念
概念:被命名的整形常量的集合。
作用:在游戏开发中,对象很多时候会有许多状态,综合考虑可用int来表示它的状态(例如:行走为1,待机为2,跑步为3等等),将枚举项与数字进行联系,可以方便直观分清状态的含义,增强代码的可读性。
(2)申明枚举变量
Step01:申明枚举(创建一个自定义的枚举类型)
【注1】一般不会去赋值,默认第一个整形常量值是0,往后累加
【注2】申明枚举的位置:常在namespace语句块中,也可申明在class/结构体中,但不能申明在函数语句块中
enum E_自定义枚举名
{自定义枚举名1, //默认是0自定义枚举名2=5, //如果更改了就变为从5开始累加了自定义枚举名3, // 6
}
Step02:使用申明的自定义枚举类型创建一个枚举变量
【注】枚举变量常常和分支语句配合使用(如果没有枚举值的话,就要自定义playertype=1表示什么,等于2表示什么,代码的可读性就不强了)

(3)枚举的类型转换
枚举和int互转:括号强转
//枚举转int
int i=(int)playerType;
//int转枚举
playerType=0;
枚举和string互转:
//枚举转string
string str=playerType.ToString();
//string转枚举
playerType=(E_playerType)Enum.Prase(typeof(E_playerType),"Other");
//Parse后 第一个参数:你要转为的是哪个类型 第二个参数:用于转换的对应枚举项的字符串
//转换完毕后是一个通用类型,还需要用括号强转成我们想要的目标枚举类型
3.一维数组
【注】(一般一维数组简称为数组):有序存储相同类型数据的集合
(1)数组的声明(5种方式)

(2)数组的使用
A、获取长度:
数组变量名.length
B、获取数组中的元素(索引值从0开始,一定注意不能越界,索引不能超过数组范围,即0~length-1):
数组变量名[索引值]
C、修改数组元素(同一类型的值):
数组变量名[索引值]=数值
D、遍历数组,for循环获得下标:
for (int i=0;i<array.length;i++)
{Console.WriteLine(array[i]);
}
E、增加/删除数组元素:数组初始化后不能增删元素,非要增删元素只能申明新的数组,用for循环遍历原数组,将其元素存入新数组中
int[] array2=new int[6];
//搬家
for(int i=0;i<array.length;i++)
{array2[i]=array[i];
}
array=array2;
G、查找数组元素,即查找某个数组元素在数组中的什么位置。通过遍历去确定数组中是否存储了这个目标元素
int a=3;for(int i=0;i<array.length;i++)
{if(a==array[i]){Console.WriteLine("和a相等的元素在{0}索引位置",i);break;}
}
4.二维数组
二维数组:使用2个下标(索引)来确定元素的数组,2个下标可以理解为行标和列标,类似于矩阵。
作用:一般用来存储矩阵,在控制台小游戏中可以用二维数组来表示地图格子
(1)声明二维数组变量(类似一维数组)

(2)二维数组的使用
A、获取长度:GetLength方法
//得到多少行
Console.WriteLine(array.GetLength(0));
//得到多少列
Console.WriteLine(array.GetLength(1));
}
B、获取数组中的元素
Console.WriteLine(array[0,1]);
Console.WriteLine(array[1,2]);
}
C、修改数组元素(同一类型的值)
array[0,0]=99;
Console.WriteLine(array[0,0]);
}
D、遍历(两层循环嵌套)
for(int i=0;i<array.GetLength(0);i++)
{for(int j=0;j<array.GetLength(1);j++){Console.WriteLine(array[i,j]);}
}
E、增加/删除数组元素与一位数组类似
int[,] array2=new int[3,3];for(int i=0;i<array.GetLength(0);i++)
{for(int j=0;j<array.GetLength(1);j++){array2[i,j]=array[i,j];}
}
F、查找数组元素:类似一维数组
5.交错数组(非重点知识,了解就好)
交错数组是数组的数组,每个维度数量可以i不同,二维数组的每行的列数都是相同的,但交错数组每行列数可以不同
(1)交错数组的声明

(2)交错数组的使用
A、获取长度
//得到多少行
Console.WriteLine(array.GetLength(0));
//得到某一行的列数
Console.WriteLine(array[0].length);
}
B、获取和修改元素
//注意:不要越界
//获取
Console.WriteLine(array[0][1]);
//修改
array[0][1]=99;
Console.WriteLine(array[0][1]);
}
C、遍历交错数组
for(int i=0;i<array.GetLength(0);i++)
{for(int j=0;j<array[i].Length;j++){Console.Write(array[i][j]+" ");}Console.WriteLine();
}
6.补充:关于数组的常见考题
(1)数组和List的区别
从大小可变性和内存分配上:List的本质是一种动态的数组。它可以通过自动扩展内部数组的容量来实现动态增长,当元素被添加到List中时,如果容量不足,它会重新分配一块更大的内存,并将原有元素复制到新的内存中,也由于List需要进行内存重新分配和元素复制,频繁地添加或删除元素可能会导致性能下降。
而Array(数组)在创建时需要指定固定容量,并且无法直接改变容量,若需要扩容,就要创建一个新的更大容量的数组,将原数组元素复制到新的数组中。
从可使用的方法上来说:list有更多的方法如add、remove、insert等,对元素操作更方便。
从使用场景上来说:需要动态增减元素的情况,或者不确定具体需要多少存储空间的时候用list,主要用于索引访问和遍历,而不需要更改内存大小,且对性能有较高要求时使用数组。
(2)数组参数是什么
数组参数指的是将数组作为参数传递给方法或函数。
当数组作为参数传递给方法时,实际上是传递了数组的引用。这意味着在方法内部对数组所做的任何修改都会影响到原始数组,也就是说方法可以访问和修改数组的元素,并且可以获取数组的长度和维度信息,最后方法可以返回对数组元素的修改,因为传递的是引用。
二、值类型和引用类型

1.存储和使用上的区别
存储上:值类型——存储在栈上,大小由系统分配,自动回收,小而快;
引用类型——存储在堆上,赋值时拷贝的是地址,手动申请和释放,大而慢
使用上:值类型——它变我不变;引用类型——它变我也变
假设值类型对象a赋值给了b,相当于是将内容拷贝给了b,其中a的值发生了改变,b的值不会跟着改变,而引用类型对象a赋值给了b,其实只是将引用地址赋值给了b,两者指向同一个值,若a的值发生了改变,b的值也会改变。
2.特殊的引用类型:String
String是引用类型,但在赋值使用时也是它变我不变的,原因是字符串的值存储在静态存储区,引用地址存储在栈,就算修改了字符串的值,也是在静态存储区中新分配了一块区域存储修改后的值,原先的引用地址发生了改变,指向新的值。因此假设字符串对象a赋值给了b,其中a的值发生了改变,是指a的引用地址改变了,指向了新的值,b的引用地址跟存储的值都不变 。
3.补充:常见考题
除了上述值类型与引用类型的区别、string为什么是特殊的引用类型外,还可能问到:
(1)String和StringBuilder的区别
string每次修改拼接时会重新分配内存空间,产生垃圾,而stringBuilder修改字符串时不会创建新的对象,因此需要频繁修改和拼接的字符串可以用stringBuilder,可以提升性能。但string提供了更多方法供使用,需要使用这些特殊方法来处理一些特殊逻辑时可以使用string。
(2)深拷贝和浅拷贝
浅拷贝复制对象的引用,导致原始对象和拷贝对象共享相同的数据;
深拷贝创建一个新对象并复制所有属性值,使得原始对象和拷贝对象独立开来,对其中一个对象的修改不会影响另一个对象。
三、函数(方法)
1.函数基础
(1)基本概念
函数(也称方法)本质是一块具有名称的代码块,可以使用函数的名称来执行该代码块,函数时封装代码进行重复使用的一种机制,提升代码的复用率
(2)函数写的位置
A、class语句块中
B、struct语句块中
【注】不能在函数中定义函数!
(3)基本语法
static 返回类型 函数名(参数类型 参数名1,参数类型 参数名2,...)
{函数的代码逻;return 返回值; //如果有返回值类型才返回
}//【说明】
//1、关于static 不是必须的,在没有学习类和结构体之前都是必须写的
//2、关于返回值类型引出一个关键字:void(表示没有返回值类型)
//3、返回类型可以写任意的变量类型
//4、关于函数名,一般使用帕斯卡命名法: MyName(帕斯卡命名法) myName(驼峰命名法,一般用于变量命名)
//5、参数不是必须的,可以有0~n个参数,参数也可以是任意类型的,有多个参数时需要用逗号隔开
//6、返回值类型不是void时,必须用新的关键词 return 返回对应类型的内容(即使是void也可以选择性使用return)
(4)实际运用
A、无参无返回值
在class中定义函数:
static void SayHello()
{Console.WriteLine("Hello world");//return ;
}
在main函数中调用该函数:
static void Main(string[] args)
{SayHello();
}
B、有参无返回值
定义:
static void SayYourName(string name)
{Console.WriteLine("your name is:{0}",name);//return ;
}
调用:
static void Main(string[] args)
{string str=“小梁”;SayYourName(str);
}
C、无参有返回值
定义:
static string WhatYourName()
{return "小梁";
}
调用:一般直接拿返回值来用(这里例子用了函数嵌套),要不就是拿变量接收他的结果
static void Main(string[] args)
{//直接拿返回值来用,比如这里作为参数传入其他函数中SayYourName(WhatYourName());//拿变量接收结果string str2=WhatYourName()
}
D、有参有返回值
定义:
static int Sum(int a,int b)
{return a+b;//【注】return后可以是一个值,也可以是表达式,只要表达式的结果和返回值类型是一致的就行
}
调用:
static void Main(string[] args)
{Console.WriteLine(Sum(2,5));
}
E、有参有多个返回值
定义:
static int[] Calc(int a,int b)
{int sum=a+b;int avg=sum/2;return new int[] {sum,avg};
}
调用:
//如果是数组作为返回值,那么前提是使用者知道这个数组的规则
int[] arr=Cals(5,7);
Console.WriteLine(arr[0]+" "+arr[1]);
(5)关于return
即使函数没有返回值,也可使用return;
return可以直接不执行之后的代码,直接返回到函数外部(提前结束函数逻辑)
static viod Speak(string str)
{if(str=="混蛋"){return;}Console.WriteLine(str);
}
static string Speak(string str)
{if(str=="混蛋"){return "";}return str;
}
2.ref和out:函数参数的修饰符
(1)使用ref和out的原因
ref和out都是对函数参数的修饰符,起到的作用都是使参数在函数内部改值或重新声明时,能够将外部传入的这个变量也跟着被更改。
比如定义一个这样的函数:
static void ChangeValue(int value)
{value=3;
}
传入a=1调用函数,a的值还是1:
int a=1;
ChangeValue(a);
Console.WriteLine(a);
原因就在于函数传入参数值时相当于是将a赋值给了value(value=a),结合值类型和引用类型的知识,value的值变了,a是不会变的。要做到value变a也跟着变,就要用到ref和out修饰符
(2)ref和out的使用及区别
static void ChangeValueRef(ref int value)
{value=3;
}static void ChangeValueOut(out int value)
{value=99;
}
ref和out的区别在于:使用ref,传入的变量必须初始化,但在内部可改可不改;使用out,传入的变量不用初始化,但必须在内部赋值
3.变长参数和参数默认值
(1)变长参数关键字:params
static int Sum(params int[] arr)
{int sum=0;for(int i=0;i<arr.Length;i++){sum+=arr[i];}return sum;
}
调用:
static void Main(string[] args)
{Console.WriteLine(“变长参数和参数默认值”);Sum();Sum(1,2,3,4,5,6,7);
}
【注1】params int[ ] 意味着可以传入n个int参数,n可以为0,传入的参数会存在数组中
【注2】params后面必须接数组
【注3】数组的类型可以是任意类型
【注4】参数可以有别的参数和params修饰的参数
【注5】参数中只能最多出现一个params关键字,并且一定在最后一组参数的后面,前面可以有n个其他参数
(2)参数默认值
有默认值的参数称为可选参数,其作用是 当调用函数时可以不传入参数,不传就会使用默认值作为参数的值
static void Speak(string str="无话可说")
{Console.WriteLine(str);
}
调用:
static void Main(string[] args)
{Speak();Speak("我有好多话要说");
}
【注1】支持多参数默认值,每个参数都可以设置默认值
【注2】若要混用普通参数和可选参数,那可选参数必须写在普通参数后面
4.函数重载
(1)基本概念
在同一语句块(class或struct)中,函数名相同,但参数数量不同 或者 参数数量相同但参数类型或顺序不同
(2)作用
命名一组功能相似的函数,减少函数名的数量,避免命名空间的污染,提升程序可读性
(3)实例

【注1】重载与返回值类型无关,只和参数的个数、类型、顺序有关。在调用时程序会自己根据传入参数的类型判断使用哪个函数进行重载
【注2】加ref、out、params也可以算作重载。但用了ref就不能用out修饰同一参数,反之亦然,可选参数不能算重载
5.递归函数
基本概念:让函数自己调用自己

【注】一个正确的递归函数必须要有能结束调用的条件
四、复杂数据(变量)类型——结构体
1.基本概念与作用
基本概念:结构体是一种自定义变量类型(类似枚举需要自己定义),它是数据和函数的集合,在结构体中可以申明各种变量和方法。
作用:用来表现存在关系的数据集合
2.基本语法
定义位置:一般申明写在namespace中,使用位置在函数中
作用:将变量包裹到结构体内部,将一些方法封装在结构体中
关键字:struct
访问修饰符(默认不写为private):
private:私有的,只能在内部使用
public:公有的,可以被外部访问
语法:
struct 自定义结构体名
{//第一部分//变量//第二部分//构造函数(可选)//第三部分//函数
}
【注1】结构体的名字规范是帕斯卡命名法
【注2】结构体中变量不能初始化,变量类型可以写任意类型,但不能是自己的结构体
3.实例
声明:

使用:
4.结构体的构造函数
(1)基本概念与作用
结构体的构造函数:
a.是一个函数,但没有返回值
b.并且函数名必须和结构体名相同
c.必须有参数
d.如果申明了构造函数,那么必须在其中对所有变量数据初始化
作用:帮助使用者快速初始化结构体对象
(2)实例
声明:

调用:

相关文章:
Unity学习笔记(零基础到就业)|Chapter02:C#基础
Unity学习笔记(零基础到就业)|Chapter02:C#基础 前言一、复杂数据(变量)类型part01:枚举数组1.特点2.枚举(1)基本概念(2)申明枚举变量(3ÿ…...
容器化的基础概念:不可变基础设施解释:将服务器视为乐高积木,而非橡皮泥。
不可变基础设施解释:将服务器视为乐高积木,而非橡皮泥。 想象一下用乐高积木代替橡皮泥进行搭建。使用橡皮泥时,您可以直接塑形和改变它。而使用乐高积木,您需要逐个零件搭建特定结构,并在需要时整体替换它们。这就是…...
智胜未来,新时代IT技术人风口攻略-第二版(弃稿)
文章目录 抛砖引玉 鸿蒙生态小科普焦虑之下 理想要落到实处校园鼎力 鸿蒙发展不可挡培训入场 机构急于吃红利企业布局 鸿蒙应用规划动智胜未来 技术人风口来临 鸿蒙已经成为行业的焦点,未来的发展潜力无限。作为一名程序员兼UP主,我非常荣幸地接受了邀请…...
Git分支和迭代流程
Git分支 feature分支:功能分支 dev分支:开发分支 test分支:测试分支 master分支:生产环境分支 hotfix分支:bug修复分支。从master拉取,修复并测试完成merge回master和dev。 某些团队可能还会有 reale…...
数据库管理-第150期 Oracle Vector DB AI-02(20240212)
数据库管理150期 2024-02-12 数据库管理-第150期 Oracle Vector DB & AI-02(20240212)1 LLM2 LLM面临的挑战3 RAG4 向量数据库LLM总结 数据库管理-第150期 Oracle Vector DB & AI-02(20240212) 作者:胖头鱼的鱼…...
MySQL双写机制
双写机制 问题的出现 在发生数据库宕机时,可能Innodb正在写入某个页到表中,但是这个页只写了一部分,这种情况被称为部分写失效,虽然innodb会先写重做日志,在修改页,但是重做日志中记录的是对页的物理操作,但…...
uniapp的配置和使用
①安装环境和编辑器 注册小程序账号 微信开发者工具下载 uniapp 官网 HbuilderX 下载 首先先下载Hbuilder和微信开发者工具 (都是傻瓜式安装),然后注册小程序账号: 拿到appid: ②简单通过demo使用微信开发者工具和…...
【ES】--Elasticsearch的分词器深度研究
目录 一、问题描述及分析二、analyze分析器原理三、 multi-fields字段支持多场景搜索(如同时简繁体、拼音等)1、ts_match_analyzer配置分词2、ts_match_all_analyzer配置分词3、ts_match_1_analyzer配置分词4、ts_match_2_analyzer配置分词5、ts_match_3_analyzer配置分词6、ts…...
【Langchain Agent研究】SalesGPT项目介绍(三)
【Langchain Agent研究】SalesGPT项目介绍(二)-CSDN博客 上节课,我们介绍了salesGPT项目的初步的整体结构,poetry脚手架工具和里面的run.py。在run.py这个运行文件里,引用的最主要的类就是SalesGPT类,今天我…...
Java安全 URLDNS链分析
Java安全 URLDNS链分析 什么是URLDNS链URLDNS链分析调用链路HashMap类分析URL类分析 exp编写思路整理初步expexp改进最终exp 什么是URLDNS链 URLDNS链是Java安全中比较简单的一条利用链,无需使用任何第三方库,全依靠Java内置的一些类实现,但…...
【网站项目】026校园美食交流系统
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...
使用raw.gitmirror.com替换raw.githubusercontent.com以解决brew upgrade python@3.12慢的问题
MacOS系统上,升级python3.12时,超级慢,而且最后还失败了。看了日志,发现是用curl从raw.githubusercontent.com上下载Python安装包超时了。 解决方案一:开启翻墙工具,穿越围墙 解决方案二:使用…...
深度学习的进展
#深度学习的进展# 深度学习的进展 深度学习是人工智能领域的一个重要分支,它利用神经网络模拟人类大脑的学习过程,通过大量数据训练模型,使其能够自动提取特征、识别模式、进行分类和预测等任务。近年来,深度学习在多个领域取得…...
[高性能] - 缓存架构
对于交易系统来说,低延时是核心业务的基本要求。因此需要对业务进行分级,还需要对数据按质量要求进行分类,主要包含两个维度:重要性,延时要求,数据质量。共包含以下三种场景: 1. 重要 延时性要…...
django实现外键
一:介绍 在Django中,外键是通过在模型字段中使用ForeignKey来实现的。ForeignKey字段用于表示一个模型与另一个模型之间的多对一关系。这通常用于关联主键字段,以便在一个模型中引用另一个模型的相关记录。 下面是一个简单的例子࿰…...
飞天使-k8s知识点14-kubernetes散装知识点3-Service与Ingress服务发现控制器
文章目录 Service与Ingress服务发现控制器存储、配置与角色 Service与Ingress服务发现控制器 在 Kubernetes 中,Service 和 Ingress 是两种不同的资源类型,它们都用于处理网络流量,但用途和工作方式有所不同。Service 是 Kubernetes 中的一个…...
任务调度
1.学习目标 1.1 定时任务概述 1.2 jdk实现任务调度 1.3 SpringTask实现任务调度 1.4 Spring-Task 分析 1.5 Cron表达式 https://cron.qqe2.com/ 2. Quartz 基本应用 2.1 Quartz 基本介绍 2.2 Quartz API介绍 2.3 入门案例 <dependency> <groupId>org.springframe…...
深刻反思现代化进程:20世纪与21世纪的比较分析及东西方思想家的贡献
深刻反思现代化进程:20世纪与21世纪的比较分析及东西方思想家的贡献 摘要:随着人类社会的快速发展,现代化已成为全球范围内的普遍追求。然而,20世纪至21世纪的现代化进程并非一帆风顺,它伴随着环境破坏、社会不平等和文…...
【FTP讲解】
FTP讲解 1. 介绍2. 工作原理3. 传输模式4. 安全5. 设置FTP服务器6. FTP命令 1. 介绍 FTP(File Transfer Protocol)是“文件传输协议”的英文缩写,它是用于在网络上进行数据传输的一种协议。FTP是因特网上使用最广泛的协议之一,它…...
java面试题整理
2023.2.14(第二天) 数组是不是对象? 在Java中,数组是对象。数组是一种引用类型,它可以存储固定大小的相同类型的元素序列。在Java中,数组是通过new关键字创建的,它们在内存中被分配为对象&…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
