【调试方法】基于vs环境下的实用调试技巧
前言:
对万千程序猿来说,在这个世界上如果有比写程序更痛苦的事情,那一定是亲手找出自己编写的程序中的bug(漏洞)。作为新手在我们日常写代码中,经常会出现报错的情况(好的程序员只是比我们见过的bug多从而减少出错),但当我们遇到报错时大家可能都会出现看不懂的情况,以至于在那里捣鼓半天最后还是当上了“C/V”工程师。本期,基于vs环境下我将带领大家去搞懂代码的调试的小技巧。
文章目录
- 1. 什么是bug?
- 2. 调试是什么?有多重要?
- 2.1 调试是什么?
- 2.2 调试的基本步骤
- 2.3 Debug和Release的介绍
- 3. Windows环境调试介绍
- 3.1 调试环境的准备
- 3.2 学会快捷键
- 4.实例演示
- 4.1实例一:阶乘之和
- 5.2 实例二:死循环问题
1. 什么是bug?
首先,当我们想要去战胜它时,我们先要了解它。就像打战一样,知己知彼方能百战不殆。
大概由来就是有一次在编写程序计算机发生故障,经过排查,在计算机的继电器触电里,找到了一只被夹扁的小飞蛾,这只小虫子卡住了机器的运行,并诙谐的把程序故障称为“bug”。这就是我们今天最爱说的“bug”的由来。它的意思,和原身一致,真就是“一只臭虫”。
具体原因可以了解:
bug的由来
2. 调试是什么?有多重要?
就像警察办案,根据线索一步步的推理和考察,最后得出最后的真相。或许我们最有印象的就是我们看过的【名侦探柯南】。一名优秀的程序员是一名出色的侦探,每一次调试都是尝试破案的过程*
对于绝大多数的新手玩家而言,我们写代码就是“三下五除二”,管它三七二十一一上来就是一顿猛敲,但是到最后的看着密密麻麻的报错,人都要麻了。
又是如何排查出现的问题的呢?
调试错误时或许像这样:
这样无脑的去进行增删查改,到最后忙活半天可能都还在原地踏步。因此,掌握好调试就显得十分重要。
2.1 调试是什么?
调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
2.2 调试的基本步骤
a.发现程序错误的存在
b.以隔离、消除等方式对错误进行定位
c.确定错误产生的原因
d.提出纠正错误的解决办法
e.对程序错误予以改正,重新测试
2.3 Debug和Release的介绍
紧接着我们再来看一下VS下的两种版本,即-----Debug和Release
a:
Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供强大的应用程序调试能力,便于程序员调试程序。
b:
而Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信 息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。
我们还是通过代码来展示:
#include<stdio.h>int main()
{char* p = "hello world";printf("%s\n", p);return 0;
}
当我们写出以上代码并且放在【Debug】版本下运行
当我们去文件查看在【debug】下的信息时,我们看到结果如下图所示:
而当我们的代码在【Release】版本下运行的时候:
我们可以看到同样的程序在两个版本下的文件大小是不同的。
所以我们说调试就是在Debug版本的环境中,找代码中潜伏的问题的一个过程。
那编译器进行了哪些优化呢?
请看如下代码:
int main()
{int i = 0;int arr[10] = { 0 };for (i = 0; i <= 12; i++){arr[i] = 0;printf("hehe\n");}return 0;
}
是 【debug 】模式去编译,程序的结果是死循环
【release 】模式去编译,程序没有死循环。
那他们之间有区别,就是因为优化导致的。
3. Windows环境调试介绍
注:linux开发环境调试工具是gdb,后期课程会介绍
3.1 调试环境的准备
在环境中选择 debug 选项,才能使代码正常调试。
3.2 学会快捷键
上图我打钩的就是平时经常用得到的一些快捷键,记住快捷键将大大提高我们调试的效率,接下来我将具体介绍:
F5
启动调试,经常用来直接跳到下一个断点处。
F9
创建断点和取消断点
断点的重要作用,可以在程序的任意位置设置断点。
这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
F10
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
F11
逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最长用的)。
CTRL + F5
开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。
更多的快捷键,可以通过如下查看:
https://blog.csdn.net/mrlisky/article/details/72622009
4.实例演示
说了那么多,终究全是书面上的东西,接下来我们通过具体的实例带大家感受一下。
4.1实例一:阶乘之和
代码思维:
在我们开始写代码之前一定要想好n的阶乘和是什么?
当我们脑海中有了思路之后,写起来就会很快,而不是直接就上手:逻辑很简答,首先输入n表示n的阶乘之和,最后在进行求和操作即可
紧接着,想每一步需要用到的知识,具体如下:
1、阶乘:1x2x3…xn 用到了循环语句
2、求和:还是用到了循环
最后就是打印出来即可!!
代码如下:
int main()
{int i = 0;int sum = 0;//保存最终结果int n = 0;int ret = 1;//保存n的阶乘(乘法的话一定要初始化为1)scanf("%d", &n);for (i = 1; i <= n; i++){int j = 0;for (j = 1; j <= i; j++){ret *= j;}sum += ret;}printf("%d\n", sum);return 0;
}
好了,有了以上代码之后,我们接着就要去验证此时写出来的代码是否正确。开始时,我们举个简单的例子,以输入【3】为例。在我们的想象中,【3】的阶乘之后就是:
第一步:1的阶乘,即1;
第二步:2的阶乘,即12=2;
第三步:3的阶乘,即12*3=6;
第四步:三数相加,即1+2+6=9(即最终结果为9)
那么真的是这样吗?接下来我们就通过一步步的调试去看看结果。
首先看到我们进入了内存循环,此时i = 1, j = 0,循环会开始执行一次,因此可以求出此时【1】的阶乘为 :1! = 1
当第一次跳出内层循环之后,我们就可以求出【1!】,因此可以看到【sum】此时为1
紧接着我们再去计算【2!】,此时在我们函数的内部,会进行两次的循环操作,执行完毕后,此时各个值如下表所示:
此时将我们【2!】计算完毕之后,可以得到【ret】的值,最后在进行累加的操作,即【1+2】的操作,所以此时的【sum】应该为3,结果如下:
前两次执行完之后,紧接着就回去执行【3!】的操作,在内部进行三次循环操作,我们已经知道,【3!】的结果为6,我们在继续【F10】看结果:
第一次内部循环开始,此时【j=1】,【ret=2】
第二次循环完毕之后,此时【j=2】,【ret=4】
第三次循环完毕之后,我们可以发现此时【j=3】,【ret=12】
最后一步在循环完之后,我们就需要计算累加和,此时我们可以发现当【j=4】时我们跳出循环操作,而最终的结果显示的是【15】,明明应该是【9】啊.(咦…怎么会是【15】呢?此时各位好奇的小脑袋瓜就开始躁动起来了)
遇到程序出错了不要害怕,我们仔细分析一下。 我们来整理一下,这样写的思路:
a:
n=1时,我们进入第一个循环,然后并没有发生什么,进入第二个循环【ret=1*1】,【sum=0+1】,此时是没有问题的;
b:
n=2时,我们在进入在第一个循环,没有发生什么,进入第二个循环,【ret=1 * 1=1】,但是请注意,在这之后,并不会计算【sum=sum+ret】,而是继续在第二个循环中没有跳出来,因为第二个循环的条件是【i<2】,此时仍然是真的,所以,第二个循环继续,【ret=1 *2=2】;在跳出第二个循环,【sum=0+2】,但是请注意,此时第一个循环没有结束,对于第一个循环,此时【n=1】,还要继续【n=2】的情况,所以最终结果是【4】,因此在这一步就出现了错误。
因此我们可以这样改(每次重置【ret】的值),此时运行结果就正确了:
还有一种方法就是我们可以不使用两层嵌套来进行封装,我们只定义一层循环,具体代码如下:
int main()
{int n = 1;scanf("%d", &n);int ret = 1;//保存n的阶乘(乘法的话一定要初始化为1)int i = 1;int sum = 0;//保存最终结果for (i = 1; i <= n; i++){ret *= i;sum += ret;}printf("%d\n", sum);return 0;
}
5.2 实例二:死循环问题
首先我给出一段代码,大家可以猜猜程序最后将会输出什么:
int main()
{int i = 0;int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };for (i = 0; i <= 12; i++){arr[i] = 0;printf("hehe\n");}return 0;
}
相信大多数的小伙伴看到这个程序的第一印象就是,数组下标为【0-9】,而这里却是【<=12】,很显然的问题就是数组访问越界
然而真的是这样的吗?老规矩直接运行程序,看最终是不是我们想的那样。
咦…我们发现怎么结果会是死循环打印呢?接下来,你如果要搞清楚这个问题,你能肉眼分析出来是因为什么吗?这时候就需要用到调试了
开始时我们进入循环,对数组进行初始化操作,得到以下结果
紧接着我们进入循环里面去,对数组元素都改为【0】,一直进行到对【arr[9]】的操作,到这个元素都是在我们的正常范围之内进行的。
那么接下来的【arr[10]】呢?【arr[11]】和【arr[12]】呢?它们是什么样的呢?我们继续调试下去
从上图 我们可以发现它依然对其进行操作,那么为什么对【arr[10]】这个位置还能访问得到呢?接下来我给大家解释解释
因为当我们的数组存,放在内存中的时候是有一片连续存储的空间,而数组之后也存在一定的空间,而这一片连续的地址空间都存在于【main】函数的栈帧空间下,在它看来存储空间之间都是连续的,因此数组之后的空间也是可以访问到的。
除了这个问题之外,还有一个明显的问题不知道大家有没有发现,就是当我们执行到最后时,【i】和【arr[12]】两个值竟然同时变为了0,这又是为什么呢?
接下来我们我们分别对两个进行取地址的操作,就可以发现这两个竟然是指向的同一片地址空间
到了这我们就可以想到,对于变量【i】,它应该是位于整个数组结束位置的后两位上,只有这样才会在数组越界访问的情况下改变【i】的值,最后在修改这块块空间中的值时将循环变量【i】的值做了修改,因此使得【i】的值永远不可能到达13,因此才会出现死循环打印的情况。
接下来,我们通过内存布局来进行进一步的了解。
首先我们知道【i】和【arr】是局部变量元素,而局部变量是放在内存中的栈区上的,而栈区的使用习惯是先用高地址空间再用低地址空间(这点非常重要),可以发现变量a的地址是比变量b的地址来得大的。
那么在内存中栈区究竟是怎么样的呢?我们通过以下图片为例。
程序一进到【main】函数的函数栈帧中时,就会先为变量【i】开辟一块空间,接着可能就会空出几个位置再为【arr】数组开辟十个元素的空间,根据上述我们可以发现空出来了几个位置,那么为什么要空出来呢?(这里面可是有大学问的)
这并不是我规定的或者谁规定的,中间的大小而是取决于编译器
1.VC6.0编译器下,中间就没有多余的空间;
2.在gcc这个Linux环境下的编译器中,创建的局部变量之间会空出一个整型,也就是4个字节
3.在VS 2013/2019/2022这些编辑器中,中间都会空出两个整型,也就是8个字节
因此在不同的编译器下去运行这段代码虽然得到的都是死循环这个现象,但是底层的实现是有些区别的。
紧接着我们可以知道数组在平时的使用过程中都是从低到高的,但是数组的地址是否也是这样的呢?我们进行一下测试。
从上图我们可以发现数组的每个元素地址都是从低到高进行一个变化的。
有了这些知识储备之后,我们在回过头去看最开始的问题,这时就可以很好的回答了:
程序开始的时候,变量【i】先创建出来,在内存中先开辟的地址空间;而【arr】数组的地址空间是后开辟出来的。但是,刚才我们已经知道数组的下标和数组元素的地址变化顺序都是从低到高,而内存中的堆栈则是先使用高地址,再使用低地址,因此当数组进行向后访问时,就有可能找到变量【i】,并且把其覆盖掉,因此就有可能把循环变量的值改为其他的情况,从而导致循环结束条件不能达到,就导致了死循环打印的现象。(到此一切就讲通了)
因此,正确的解决方案还是改我们的循环结束条件。
总结:
通过本期的学习,我相信大家以后在遇到程序出现报错的时候就不会无脑的直接去程序里面增删查改了,大家可能会说这个很难,但是俗话说得好呀!(害怕恐惧的最好办法就是战胜恐惧)
以上便是本期的所有内容啦!感谢您的观看,如果对你有帮助的话记得三连支持一下哟!
相关文章:
【调试方法】基于vs环境下的实用调试技巧
前言: 对万千程序猿来说,在这个世界上如果有比写程序更痛苦的事情,那一定是亲手找出自己编写的程序中的bug(漏洞)。作为新手在我们日常写代码中,经常会出现报错的情况(好的程序员只是比我们见过…...
单目标应用:蜣螂优化算法DBO优化RBF神经网络实现数据预测(提供MATLAB代码)
一、RBF神经网络 1988年,Broomhead和Lowc根据生物神经元具有局部响应这一特点,将RBF引入神经网络设计中,产生了RBF(Radical Basis Function)。1989年,Jackson论证了RBF神经网络对非线性连续函数的一致逼近性能。 RBF的基本思想是…...
MTK平台开发入门到精通(Thermal篇)热管理介绍
文章目录 一、热管理组成二、Linux Thermal Framework2.1、thermal_zone 节点2.2、cooling_device 节点三、Thermal zones沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍MTK平台的热管理机制,热管理机制是为了防止模组在高温下工作导致硬件损坏而存在的…...
最好的 QML 教程,让你的代码飞起来!
想必大家都知道,亮哥一直深耕于 CSDN,坚持了好很多年,目前为止,原创已经 500 多篇了,一路走来相当不易。当然了,中间有段时间比较忙,没怎么更新。就拿 QML 来说,最早的一篇文章还是 …...
笔记(六)——stack容器的基础理论知识
stack是堆栈容器,元素遵循先进后出的顺序。头文件:#include<stack>一、stack容器的对象构造方法stack采用模板类实现默认构造例如stack<T> vecT;#include<iostream> #include<stack> using namespace std; int main(…...
Web前端学习:四 - 练习
三九–四一:百度页面制作 1、左右居中: text-align: center; 2、去掉li默认的状态 list-style: none; li中有的有点,有的有序,此代码去掉默认状态 3、伪类:hovar 一般显示为color: #0f0e0f, 当鼠标接触时…...
odoo15 标题栏自定义
odoo15 标题栏自定义 如何显示为自定义呢 效果如下: 代码分析: export class WebClient extends Component {setup() {this.menuService = useService("menu");this.actionService = useService("action");this.title = useService("title&…...
视觉SLAM十四讲 ch3 (三维空间刚体运动)笔记
本讲目标 ●理解三维空间的刚体运动描述方式:旋转矩阵、变换矩阵、四元数和欧拉角。 ●学握Eigen库的矩阵、几何模块使用方法。 旋转矩阵、变换矩阵 向量外积 向量外积(又称叉积或向量积)是一种重要的向量运算,它表示两个向量所形成的平行…...
问题解决:java.net.SocketTimeoutException: Read timed out
简单了解Sockets Sockets:两个计算机应用程序之间逻辑链接的一个端点,是应用程序用来通过网络发送和接收数据的逻辑接口 是IP地址和端口号的组合每个Socket都被分配了一个用于标识服务的特定端口号基于连接的服务使用基于tcp的流Sockets Java为客户端…...
前端代码优化方法
1.封装的css样式,增加样式复用性。如果页面加载10个css文件,每个文件1k,那么也要比只加载一个100k的css文件慢 2.减少css嵌套,最好不要嵌套三层以上 3.不要在ID选择器前面进行嵌套,ID本来就是唯一的而且权限值大,嵌套完…...
【批处理脚本】-1.16-文件内字符串查找增强命令findstr
"><--点击返回「批处理BAT从入门到精通」总目录--> 共9页精讲(列举了所有findstr的用法,图文并茂,通俗易懂) 在从事“嵌入式软件开发”和“Autosar工具开发软件”过程中,经常会在其集成开发环境IDE(CodeWarrior,S32K DS,Davinci,EB Tresos,ETAS…)中…...
三天吃透Redis面试八股文
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...
数据湖架构Hudi(三)Hudi核心概念
三、Apache Hudi核心概念 3.1 基本概念 Hudi 提供了Hudi 表的概念, 这些表支持CRUD操作, 可以利用现有的大数据集群比如HDFS做数据文件存储, 然后使用SparkSQL或Hive等分析引擎进行数据分析查询。 Hudi表的三个主要组件: 有序的…...
在数字优先的世界中打击知识产权盗窃
在当今数据驱动的世界中,全球许多组织所面临的期望和需求正在达到前所未有的水平。 为了迎接挑战,数据驱动的方法是必要的,需要有效的数字化转型来提高运营效率、简化流程并从遗留技术中获得更多收益。 但是,虽然数字优先方法可…...
机器学习算法原理——逻辑斯谛回归
文章目录逻辑斯谛回归二项逻辑斯谛回归模型极大似然估计多项逻辑斯谛回归模型总结归纳逻辑斯谛回归 写在前面:逻辑斯谛回归最初是数学家 Verhulst 用来研究人口增长是所发现的,是一个非常有趣的发现过程, b 站有更详细的背景及过程推导&…...
【华为OD机试 】最优资源分配/芯片资源占用(C++ Java JavaScript Python)
文章目录 题目描述输入描述输出描述备注用例题目解析C++JavaScriptJavaPython题目描述 某块业务芯片最小容量单位为1.25G,总容量为M*1.25G,对该芯片资源编号为1,2,…,M。该芯片支持3种不同的配置,分别为A、B、C。 配置A:占用容量为 1.25 * 1 = 1.25G配置B:占用容量为 …...
600 条最强 Linux 命令总结
1、基本命令 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息 arch 显示机器…...
python自学之《21天学通Python》(15)——第18章 数据结构基础
数据结构是用来描述一种或多种数据元素之间的特定关系,算法是程序设计中对数据操作的描述,数据结构和算法组成了程序。对于简单的任务,只要使用编程语言提供的基本数据类型就足够了。而对于较复杂的任务,就需要使用比基本的数据类…...
从功能到自动化,熬夜3天整理出这一份2000字学习指南~
学习自动化这个想法,其实自己在心里已经琢磨了很久,就是一直没付诸实践,觉得现在手工测试已经能满足当前的工作需要,不想浪费时间去学习新的东西,有点时间还不如刷刷视频、看看小说等。 第一次有学习Selenium的冲动是…...
客户端攻击(溯源攻击,获取客户端信息)
目录 背景 为什么 示例 探索HTML应用程序 HTA攻击行为(Powershell代码) 背景 如果创建的文件扩展名为.hta而不是.html,Internet Explorer将自动将其解释为html应用程序,并提供使...
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】visual studio 安装 C# 环境安装流程创建c#窗体应用程序visual studio 安装 C# 环境 首先,进入其官网下载对应的visual studio社区版本,官网链接: https://visualstudio.microsoft…...
21- 神经网络模型_超参数搜索 (TensorFlow系列) (深度学习)
知识要点 fetch_california_housing:加利福尼亚的房价数据,总计20640个样本,每个样本8个属性表示,以及房价作为target 超参数搜索的方式: 网格搜索, 随机搜索, 遗传算法搜索, 启发式搜索 超参数训练后用: gv.estimat…...
《NFL橄榄球》:芝加哥熊·橄榄1号位
芝加哥熊(英语:Chicago Bears)是一支职业美式橄榄球球队。位于伊利诺伊州的芝加哥。现时为全国橄榄球联盟的国家联盟北区的球队。他们曾经赢出九次美式橄榄球比赛的冠军,分别为八次旧制全国橄榄球联盟和一次超级碗冠军(…...
【ES】Elasticsearch核心基础概念:文档与索引
es的核心概念主要是:index(索引)、Document(文档)、Clusters(集群)、Node(节点)与实例,下面我们先来了解一下Document与Index。 RESTful APIs 在讲解Document与Index概念之前,我们先来了解一下RESTful APIs,因为下面讲解Documen…...
实时手势识别(C++与python都可实现)
一、前提配置: Windows,visual studio 2019,opencv,python10,opencv-python,numpy,tensorflow,mediapipe,math 1.安装python环境 这里我个人使用的安装python10&#…...
15个Spring扩展点,一般人知道的不超过5个!
Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。Spring Boot更是封装了Spring,遵循约定大于配置,加上自动装配的机制。很多时候我们只要引用了一个…...
Elasticsearch:以 “Painless” 方式保护你的映射
Elasticsearch 是一个很棒的工具,可以从各种来源收集日志和指标。 它为我们提供了许多默认处理,以便提供最佳用户体验。 但是,在某些情况下,默认处理可能不是最佳的(尤其是在生产环境中); 因此&…...
js几种对象创建方式
适用于不确定对象内部数据方式一:var p new Object(); p.name TOM; p.age 12 p.setName function(name) {this.name name; }// 测试 p.setName(jack) console.log(p.name,p.age)方式二: 对象字面量模式套路:使用{}创建对象,同…...
阿里云服务器ECS适用于哪些应用场景?
云服务器ECS具有广泛的应用场景,既可以作为Web服务器或者应用服务器单独使用,又可以与其他阿里云服务集成提供丰富的解决方案。 云服务器ECS的典型应用场景包括但不限于本文描述,您可以在使用云服务器ECS的同时发现云计算带来的技术红利。 阿…...
Ajax学习笔记01
引入 翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。 AJAX 不是新的编程语言,而是一种使用现有标准的新方法。 AJAX 最大的优点…...
南京手机网站制作公司/网站制作设计
先扯两句 经过了漫长的时间,六大设计原则终于结束了,也终于进入到了23中设计模式的学习了。不过设计原则只有六条都写了这么久,设计模式有足足23种,希望这次不要再懒惰了吧。 厚着脸皮激励一下自己《设计模式》——目录&#…...
网站制作公司哪儿济南兴田德润有活动吗/seo在线工具
题目链接 第一个差分约束的题目。看了好多的博客,差分约束就是根据不等式建好图,然后求最短路或者最长路即可,很明显建图是关键。 这个题的题意是,给很多的区间,每个区间上至少ci个数,问最这些数最少有多少…...
淘宝美工与网站开发/谷歌独立站seo
上一篇文章介绍了如何对循环语句进行操作,末尾还演示了发现空串时直接继续下一循环,只是在初始化字符串数组时使用了“val poem2Array:Array<String?> ***”,该表达式不免令人疑惑,为何这里要在String后面加个问号&#x…...
wordpress创建表格/百度知道入口
前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷。 也因如此,它作为博主大二上学期最重要的必…...
手机网站建设比较好的公司/百度指数批量
面试官的问题层出不穷,我们在面试的时候总会被问到一些没接触的东西,所以就需要一个比较全面的面试复习,今天我就分享一个Java全能面试通关手册,希望能在面试方面帮助到大家。 大厂面试题目录阿里一面1.说⼀下ArrayList和LinkedL…...
河南阿里巴巴网站建设/色盲测试图
这篇主要分享的是ADAS融合系统的HIL测试系统的硬件结构及其作用,其主要包括上位机、机柜、雷达模拟器系统、雷达暗箱系统以及视频暗箱。上位机上位机主要运行HIL测试系统的相关软件,测试人员所有的前期准备工作与测试操作均在上面进行,并监控…...