- 博客(98)
- 收藏
- 关注
原创 printf 函数,常用的格式化输出样式
函数用于格式化输出,它允许你指定不同的格式说明符来控制输出的格式。这些格式说明符可以与各种标志、宽度、精度和长度修饰符组合使用,以实现更复杂的格式化输出。表示打印一个有符号整数,并用前导零填充到至少8位宽;表示打印浮点数并保留两位小数。
2024-10-30 15:38:02
283
原创 C语言中一般内存溢出的情况
在C语言中,内存溢出(Memory Overflow)通常指的是程序尝试写入的数据超过了为其分配的内存空间。这通常发生在数组操作中,当程序试图访问数组之外的内存时,就可能发生内存溢出。内存溢出是一个严重的安全问题,因为它可能导致程序崩溃、数据损坏,甚至可能被恶意利用来执行任意代码。5.不正确的内存释放:在释放内存后没有将指针设置为NULL,然后将再次使用该指针。2.错误的内存分配:在动态分配内存时,没有正确计算所需的内存大小。4.缓冲区溢出:向一个固定大小的缓冲区写入过多的数据。
2024-10-24 17:53:04
578
原创 嵌入式系统---看门狗
在嵌入式系统中,看门狗定时器(Watchdog Timer,WDT)是一种常用的机制,用于检测和恢复系统在异常情况下的故障。如果系统因为某种原因(如软件死循环)而变得无响应,看门狗定时器可以自动重启系统,从而防止系统长时间处于不可用状态。要“关闭”看门狗定时器,通常意味着停止喂狗,让看门狗定时器超时并触发重启。在某些系统中,可能需要特殊的操作或权限来完全禁用看门狗定时器,这通常不推荐在正常运行的系统中进行,因为它会降低系统的可靠性和稳定性。如果系统出现问题,没有及时喂狗,看门狗定时器就会超时并触发重启。
2024-10-15 16:06:59
1700
原创 C语言的32个关键字
2. **break**: 立即退出最近的 `for`、`while` 或 `do-while` 循环。25. **static**: 声明静态变量或函数,具有限制的作用域和持久的生命周期。10. **else**: 与 `if` 配合使用,表示“否则”执行的代码块。27. **switch**: 条件语句,允许基于不同的情况执行不同的代码块。7. **default**: 用于 `switch` 语句,表示默认选项。3. **case**: 用于 `switch` 语句中,表示一个选项。
2024-07-05 11:27:43
571
原创 C语言标准库中的函数
`strncpy`: 复制一个字符串到另一个字符串,最多复制指定数量的字符。- `strncat`: 将一个字符串的部分添加到另一个字符串的末尾。- `strstr`: 查找一个字符串在另一个字符串中首次出现的位置。- `strcat`: 将一个字符串添加到另一个字符串的末尾。- `strchr`: 查找字符串中第一次出现指定字符的位置。- `strtok_r`: 可重入版本的 `strtok`。- `strcpy`: 复制一个字符串到另一个字符串。
2024-07-05 11:24:55
397
原创 IO口的工作方式:上拉输入、下拉输入、推挽输出、开漏输出
推挽电路使用两个参数相同的以推挽方式存在于电路中,两只对称的开关管每次只有一个导通,所以导通损耗小、效率高,输出既可以向负载灌电流,也可以从负载抽取电流。开漏输出的特点是可以允许多个设备共享同一个总线或信号线,通过合理的电平控制,实现对总线或信号线的协调使用,避免冲突和干扰。上拉输入是指将信号通过一个电阻连接到高电平(通常是Vcc),并通过一个触发器将不确定的信号嵌位在高电平。上拉输入和下拉输入的主要区别在于信号的来源和电平状态,需要根据具体的应用场景和电路设计需求选择合适的配置方式。
2024-01-31 15:36:35
6244
原创 C/C++中,头文件加双引号 “ ” 与加尖括号 <> 的区别
需要注意的是,双引号和尖括号可以用于包含任何头文件,但是它们的查找路径不同。在C语言中,双引号(" ")和尖括号(< >)在头文件中的使用有一些区别。而在使用尖括号包含标准库的头文件时,编译器会按照标准的包含路径进行查找。在使用双引号包含头文件时,编译器首先会在当前目录中查找;
2023-12-15 14:49:13
1862
原创 DB9串口引脚介绍
DB9串口是一种常见的串行通信接口,它包含9个引脚,用于发送和接收数据。注:管脚定义中公头和母头有一些区别,公头的2引脚是RXD,母头的2引脚是TXD。一、公头和母头 图片示意源于网络。二、 每个引脚的功能定义。
2023-11-18 14:39:21
5693
原创 C++指针【2】复合类型的声明
2.解引用int型指针会得到一个int型的数,同样解引用指向指针的指针,会得到一个指针。此时为了访问最原始的那个对象,需要对指针的指针做两次解引用。// r 引用了一个指针,因此给 r 赋值 &i 就是令 p 指向 i;//解引用 r 得到 i ,也就是 p 指向的对象,将 i 的值改为 0;引用本身不是一个对象,因此不能定义指向引用的指针。面对一条比较复杂的指针或引用的声明语句时,从右向左阅读有助于理清它真正的含义。//r是一个指针p的引用。//p是一个int型的指针。
2023-11-02 14:40:37
194
原创 嵌入式笔试【1】
栈溢出问题:每当一个函数被调用时,操作系统会为该函数创建一个新的栈帧,以存储该函数的局部变量和参数等。递归函数在深度过深的情况下,会导致系统栈空间被快速耗尽,从而引发栈溢出错误。时间和空间效率低下:对于深度递归,系统需要频繁地创建和销毁栈帧,这会消耗大量的CPU时间和内存。如果递归深度过深,或者递归算法本身就不高效,那么这种时间和空间效率的消耗会变得非常明显。可读性和可维护性降低:深度递归可能会使得代码难以理解和维护。
2023-11-02 11:54:07
230
原创 c++指针【1】
利用 void*指针能做的事儿比较有限:拿它和别的指针比较、作为函数的输入或输出,或者赋给另外一个void*指针。在C++中,你不能将一个类型的地址直接赋给另一个类型,除非它们是兼容的类型。例如,如果你有一个指向整数的指针,你可以将它转换为指向字符的指针(因为一个字符的大小和一个整数的大小通常是一样的),但你不能将它转换为指向长整数的指针。虽然它们的位数不同,但它们的对齐要求可能不同,也就是说,它们的内存模型可能不同。void*是一种特殊的指针类型,可用于存放任意对象的地址。
2023-10-28 16:59:33
140
原创 C++ Primer 11 术语表【1】生僻词释义
(buffer)是计算机内存中的一段区域,用于临时存储数据,以使数据能够在不同的速度或不同的时间进行传输或接收。一个ostream对象,关联到标准错误,通常写入到与标准输出相同的设备。默认情况下,写到cerr的数据是不可缓冲的。一个ostream对象,关联到标准错误,默认情况下,写到clog的数据是被缓冲的。(operator)。左侧运算对象必须是一个类类型对象,右侧运算对象必须是此对象的一个成员的名字。(parameter list)函数定义的一部分,指出调用函数时可以使用什么样的实参,可能为空列表。
2023-10-24 11:27:40
100
原创 C++:类型int、long、long long和short的区别;无符号 类型和带符号类型的区别;float和double的区别。
利率:利率通常是一个小数,表示每年借款成本的百分比。例如,如果贷款的年利率为5%,那么在计算时,应将这个数字以小数形式存储或计算,即0.05。付款:付款通常包括两部分,一部分是本金的一部分(通常称为本金偿还),另一部分是利息。这两部分通常都是以小数形式表示的,因此在进行付款计算时,应选择小数类型。本金:本金是贷款的原始金额,通常以整数形式表示。例如,如果贷款金额为100,000元,则应使用整数类型(如int或long等)来存储这个值。付款:小数(例如float或double)
2023-10-24 11:22:59
1805
原创 C++ 读取数量不定的输入数据
在C++中,有时我们会遇到,在事先没有知道,要对多少个数,进行求和的情况下,这就需要不断的读取数据直至没有新的输入为止。
2023-10-23 12:24:50
793
原创 C++中常见的头文件
这些头文件是由C++标准库提供的,每个头文件都包含一系列函数、类、常量等定义。当然,除了这些标准库头文件外,用户也可以自定义头文件,用于组织自己的代码。在C++中,头文件被广泛使用,用于包含函数声明、常量定义、类定义等。一般情况下,头文件包含在源文件的开头部分,这样源文件就可以访问头文件中定义的内容。C++中的头文件可以包含各种函数声明,这取决于头文件的目的和用途。
2023-10-18 15:30:54
1906
原创 C++中的函数
函数可以返回任何类型的数据,包括整数、浮点数、字符、布尔值、结构体,甚至可以是其他函数或类的对象。在C++中,函数是程序的一部分,它执行特定的任务。函数可以带有任意数量的参数,也可以没有任何参数。是传递给函数的参数的类型和名称的列表,,并且函数返回一个整数。是函数执行其任务的语句。在这个例子中,函数名是。
2023-10-18 13:47:58
132
原创 C++链接器如何工作,以及变量的表达
在C++中,作用域可以是全局的或局部的。全局变量在整个程序中都可用,而局部变量仅在其被声明的函数或代码块中可用。链接器还会检查所有的目标文件和库文件,确保没有重复的符号(例如,两个不同的函数或变量使用了相同的名称)。C++链接器是用于将编译后的目标文件(.o文件)连接在一起,生成可执行文件的过程。此外,链接器还会添加一些启动代码(startup code)到最终的可执行文件中,这些代码包含了程序的入口点(通常是。在C++中,你需要先声明一个变量,然后才能使用它。在C++中,变量是用于存储数据的容器。
2023-10-18 12:23:21
220
原创 Edge---微软浏览器-兼容性问题-解决办法(详细)
最后重启 MicrosoftEdge 浏览器,开始enjoy......在Microsoft文件夹右侧(鼠标右击),新建一个。在Edge文件夹右边界面空白部分,鼠标右键。
2023-10-17 16:24:12
2500
1
原创 RS485通讯方式-详解
5位数据位、无校验位、1位停止位等。这种总线以其差分传输方式而闻名,发送端在两条信号线上传输辐值相等,相位相反的电信号,接收端在对接收的两条信号线做减法运算,这样就能获得信号翻倍的信号。需要注意的是,RS485协议中数据位的长度和校验位的长度都是可变的,具体长度取决于协议的设定。如果需要进行更长的数据传输,可以在协议中规定更长的数据位数,例如在某些工业控制系统中,可能会有12位、16位等更长的数据位。需要注意的是,如果数据位的长度发生变化,那么校验位和停止位的长度也会相应地变化,需要根据协议规定进行设定。
2023-10-11 23:26:55
3894
原创 C++【7】构造函数、析构函数、拷贝构造函数
当创建新对象并初始化为现有对象的副本,或者一个函数以值传递方式接受一个对象,或者一个函数返回一个对象时,都会调用这个拷贝构造函数。在程序的执行过程中,当遇到某一对象的生存期结束时,系统自动调用析构函数,然后再收回对象分配的存储空间。C++中的析构函数是一种特殊的成员函数,它在一个对象的生命周期结束时被调用,以进行必要的清理工作。运算符创建一个对象时,它首先调用对象的构造函数来初始化对象,然后返回指向新创建的对象的指针。缺省的构造函数并不对所生成对象的数据成员赋值,即新产生对象的数据成员的值是不确定的。
2023-10-07 16:15:00
496
原创 C++【6】对静态成员函数的用法说明
一个指向C++类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符->,就像访问指向结构的指针一样。访问静态成员函数:静态成员函数可以在没有对象实例的情况下直接通过类名调用。也就是说,静态成员函数可以在类的对象被创建之前或没有对象的情况下被调用。定义和声明:静态成员函数需要在类定义中声明,并需要在类外部进行定义。与其他成员函数一样,静态成员函数的定义必须具有与声明相同的函数签名。静态成员变量:静态成员变量是与静态成员函数关联的变量,它们在所有对象之间共享。
2023-10-07 09:47:44
336
原创 C++【5】类与对象(三)
当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,也隐含使用this指针。成员函数重载:类中的成员函数与前面介绍的普通函数一样,成员函数可以带有缺省的参数,也可以重载成员函数。重载时,函数的形参必须在类型或数目上不同。this指针: 不同对象占据内存中的不同区域,他们所保存的数据各不相同,但对成员数据进行操作的成员函数的程序代码是一样的。定义类的指针及如何用指针来引用对象。定义类的数组及数组中元素的引用。
2023-10-06 16:27:50
105
原创 C++【5】类与对象(二)
然而,如果你真的需要其他的函数直接访问私有数据成员(这并不推荐,除非有特殊的理由),你可以在类内部提供公有的成员函数来访问。在C++中,如果你想让其他函数访问类的私有数据成员,通常的做法是通过提供公有的成员函数(getter和setter)。一般来说,如果你需要访问类的私有成员,应该通过 getter 和 setter 方法来实现,这样可以保护私有成员不被外部直接访问和修改。1.类的嵌套:在定义一个类时,在其类体中又包含了一个类的完整定义,称为类的嵌套。只是一个引用,它并不能独立存在,必须依附于类的对象。
2023-10-06 14:49:34
217
原创 C++【5】类与对象(一) 例子演示
在OOP中,现实世界中的事物被抽象为“对象”,每个对象都有其属性(成员变量)和行为(成员函数)。(Inheritance):继承是从已存在的类派生出新的类,新的类继承了原有类的属性和方法,同时可以增加新的属性和方法或者覆盖父类的方法。抽象类是一种不能被实例化的类,它只用来作为其他类的基类,包含至少一个纯虚函数。这些成员函数可以被类的实例调用,用于访问和修改类的成员变量。这样我们可以用一个统一的接口处理不同的对象,而具体对象的行为可以在运行时确定。类是对象的抽象,而对象是类的具体实例。类的所有属性和行为。
2023-10-05 16:07:28
349
原创 C++【4】指针与引用;数组指针;指针数组
可以把函数定义为引用类型,这时函数的返回值即为某一变量的引用(别名),因此,它相当于返回了一个变量,所以可对其返回值进行赋值操作。ps:当 &a 的前面有类型符时(如int &a),它必然是对引用的声明;//指针变量也重新赋值 *p=2;函数的参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。(1)指针是通过地址间接访问某个变量,而引用是通过别名直接访问某个变量。如: *(p+1) = 2;//直接用数组名赋值 p是变量 ,a 是常量。
2023-10-05 11:57:09
394
原创 c++【3】 常量、指针、指针变量、变量指针
指针变量作为函数参数与变量本身做函数参数不同,变量作函数参数传递的是具体值,而指 针函数作函数参数传递的是内存的地址。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。函数的参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。常量就像是常规的变量,只不过常量的值在定义后不能进行修改。//使用const前缀声明指定类型的常量 ,意味着不可改。封装一个交换变量的函数,将地址里面的值进行交换。其中原变量名必须是一个已定义过的变量。在C++中,有两种简单的定义常量的方式。
2023-09-28 12:26:41
186
原创 C++ 【2】
注意:一个指针变量只能指向同一类型的变量;即:整型变量只能指向存放整型变量数据的地址,如:可以定义一个变量 专门用来存放 另一变量的地址,这种变量我们称为“指针变量”变量的 指针 就是 变量的地址,当变量定义后,其指针(地址)是一 常量。一个变量的地址称为该变量的指针;在编译时同样分配一定的存储单元,为赋初值时,该存储单元的值是随机的。那么,这个变量或数组的地址(指针);(2)间接访问:将变量的地址存放到另一个单元p中,变量的 指针 和 指向变量的 指针变量。通过p取出变量的地址,再对变量操作。
2023-09-20 22:38:46
204
原创 C#_预处理指令
所有的预处理器指令都是以 # 开始。且在一行上,只有空白字符可以出现在预处理器指令之前。在 C# 中,预处理器指令用于在条件编译中起作用。一个预处理器指令必须是该行上的唯一指令。我们可以使用 #if 指令来创建一个条件指令,条件指令用于测试符号是否为真。如果为真,编译器会执行 #if 和下一条指令之间的代码。#define 允许您定义一个符号,这样,通过使用符号作为传递给 #if 指令的表达式,表达式将返回 true。C# 编译器没有一个单独的预处理器,但是,指令被处理时就像是有一个单独的预处理器一样。
2023-09-06 09:13:16
738
原创 C# 类class、继承、多态性、运算符重载,相关练习题
41.通过虚方法 area() 来计算不同形状图像的面积。,用于打印不同的数据类型。35.几个相同的函数。42.运算符重载的实现。40.抽象性和虚方法。
2023-09-04 18:16:48
1186
原创 C# 练习题
学习来源于www.runoob.com。26. Enum(枚举)27.class(类定义)32.静态函数static。30. 参数化构造函数。31.C# 析构函数。28.成员函数和封装。
2023-08-31 18:03:19
856
原创 C# 课后练习题
例如,方法 FindMax 属于 NumberManipulator 类,但更常见的做法是使用string关键字来声明一个字符串变量,您也可以使用类的实例从另一个类中调用其他类的公有方法。string关键字是System.String类的别名。在C#中,可以使用字符数组来表示字符串,您可以从另一个类 Test 中调用它。23.使用foreach循环遍历数组。17. XAF框架下的导航按钮。22. 声明、赋值、访问数组。20. 可空数据类型的方法。25.String字符。
2023-08-29 15:46:33
422
原创 C# 案例题
11.//运用Switch case的思想 枚举星期一 到星期天的案例。10.//if、else if、else逻辑判断嵌套用法。整型、双精度、单精度、布尔类型*/2. // C# 计算矩形的面积。3. // 强制类型转换1。12.// switch 嵌套的案例。@源于www.runoob.com。15. //0-100以内的质数。16. //调用方法,取最大值。13.//while 循环。5.// C#变量初始化。14. //for循环。
2023-08-25 16:05:59
756
原创 【socket编程简述】TCP UDP 通信总结、TCP连接的三次握手、TCP断开的四次挥手
而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。//地址类型,取值为AF_INET6。示例:/*监听客户端请求,accept函数返回一个新的套接字,发送和接收都是用这个套接字*/
2023-08-17 18:08:42
185
原创 Linux------Shell命令解析与Path环境变量
通常,主要的配置文件是`~/.bashrc`(用户级别)或者 `/etc/profile`(系统级别)。用户可以在Shell中执行各种命令来完成各种操作,如文件管理、进程管理、网络配置等。总之,Shell在Linux中起到了桥梁和扩展功能的作用,提供了丰富的命令和语法,使得用户可以更灵活、高效地使用和管理操作系统。(4) 在上述语句中添加你要设置的目录路径,使用冒号进行分隔,并确保路径中的内容正确无误。同时,shell也是一种脚本语言,用户可以通过编写shell脚本来自动化执行一系列命令。
2023-07-10 00:50:42
1131
原创 I2S协议
综上所述,I2S协议在音频传输方面具有高质量、低延迟和灵活性等优点,但是需要较多的线数、传输距离有限,以及对时钟同步要求较高等缺点。数据线上的数据传输是双向的,可以同时传输音频数据和控制数据。2. 较短传输距离:由于没有差分传输机制,I2S协议的传输距离较短,通常在几十厘米到几米之间,不适用于长距离传输。1. 线数较多:I2S协议需要至少3根线进行数据传输,相对于一些其他音频传输协议来说,需要的线数较多。时钟线用于同步数据传输的时钟信号,数据线用于传输音频数据,帧同步线用于确定音频数据传输的起始点。
2023-07-04 18:42:31
2194
原创 IIC(I2C)协议
在发送地址后,主设备会释放数据线,然后等待从设备应答。从设备接收到地址后,会发送一个应答位(ACK)信号,表示从设备可以进行数据传输。总结起来,I2C通信协议是一种简单而灵活的串行通信协议,具有广泛的应用领域。它的特点是速度相对较慢,但适用于连接多个设备和传感器的应用场景,并且在实现上比较简单。主设备发送从设备的地址,将数据发送到特定的从设备。停止信号是在时钟线上拉高的同时,数据线上由低变高形成的。主设备会发送需传输的数据,然后等待从设备应答。起始信号是在时钟线上拉低的同时,数据线上由高变低形成的。
2023-07-03 17:20:41
457
原创 嵌入式DSP音频_知识点归纳(1)
传统上,电子系统中的时钟频率是固定的,无论系统处于何种负载状态。EINT 的使用可以提供高效的中断处理和系统响应能力,对于实时和高性能的应用非常重要,特别是在需要与外部设备进行实时交互或同时处理多个并发任务的情况下。计数器用于记录经过的时间,时钟源选择器用于选择计时器的时钟信号源,计时/定时控制逻辑用于控制计数器的启动、停止和重置,寄存器用于配置定时器的参数和状态。总而言之,GDMA 是一种扩展和泛化的 DMA 技术,用于实现高效的数据传输和减轻 CPU 的负载,以满足对高性能和实时响应的应用需求。
2023-06-29 11:48:04
464
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人