可以实操的代码,却在Proteus无法正常运行,sprintf函数所造成的故障

简介: 可以实操的代码,却在Proteus无法正常运行,sprintf函数所造成的故障

前言

(1)昨天,接了一个写代码的单子。为了防止客户说我的代码有问题,所以就打算将代码放在Proteus上跑。(为什么不是硬件上跑呢?因为我的硬件找不到了。。。)

(2)因为我电脑安装的Proteus总是闪退,下载安装搞了很久没搞好,于是让朋友帮忙验证。结果发现了问题。


问题

(1)什么问题呢?我的代码无法在Proteus中运行!

(2)因为这个代码在硬件上跑了无数次了,所以我能百分之百的肯定代码没有问题。通过查找资料目前观测有两种可能,导致Proteus无法正常运行。


可能性一

(1)我和朋友搞了很久,一直没有发现问题所在。然后我就想着一个代码一个代码的验证。最终发现,如果代码中加入了sprintf()函数,就会卡死。

(2)后来询问了chatgpt得知:Proteus并非完全支持所有C语言标准库函数,包括sprintf()函数。这是因为sprintf()函数是一个比较复杂的函数,它涉及字符串的动态分配和格式化等操作,这些操作在仿真环境中可能会引起一些问题。(注意,这个是否正确,还有待商榷,因为我还没有找到官方的说明)

(3)因为chatgpt的可能随口就来的特性,于是我决定去Proteus官网询问。而Proteus的技术支持仅仅对于付费用户,我这种破解版的,似乎找不到反馈渠道(苦笑)。

可能性二


(1)通过查阅资料,发现sprintf指的是字符串格式化命令,使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。最终导致了Proteus无法正常运行。

(2)通过网上的大佬们博客,总结来看,有如下建议:

<1>用sprintf转换数据量比较大的参数,建议用字符数组来存,不要用指针存。

<2>sprintf 中使用到的数组全部定义成全局数组。


//例子
char str[20];   //这里是字符数组,同时是全局变量
void main()
{
  sprintf(str,"%.2f cm",distant);//转换为字符串形式
  while(1);
}


(3)但是不幸,我的代码满足上述条件。而且在实物上是可以正常运行多次的,目前没有因为这个sprintf函数卡死过。所以我个人认为可能性一是问题的关键。

总结

Proteus毕竟只是一个仿真软件,很可能与实际情况并不相符合。所以,建议一切以实际情况为标准。

目录
相关文章
|
6月前
|
存储 NoSQL 前端开发
【CSAPP】程序的机器级表示:基础知识
【CSAPP】程序的机器级表示:基础知识
90 0
|
6天前
|
网络安全
LabVIEW崩溃后如何排查故障
LabVIEW崩溃后如何排查故障
|
6天前
|
数据建模 Linux Android开发
Mstar 9632方案调试杂项临时笔记
Mstar 9632方案调试杂项临时笔记
28 0
|
6月前
|
监控 关系型数据库 MySQL
『Jmeter入门万字长文』 | 从环境搭建、脚本设计、执行步骤到生成监控报告完整过程
『Jmeter入门万字长文』 | 从环境搭建、脚本设计、执行步骤到生成监控报告完整过程
170 2
|
10月前
|
API 数据处理
2022年十月份电赛OpenMV巡线方案(2)---主控代码详细分析
2022年十月份电赛OpenMV巡线方案(2)---主控代码详细分析
101 0
|
10月前
|
运维 测试技术
嵌入式软件测试笔记12 | 什么是状态转换测试?如何开展?
嵌入式软件测试笔记12 | 什么是状态转换测试?如何开展?
126 0
|
11月前
|
传感器 Windows
关于单片机编程里面调用sprintf死机的解决方法及原因分析
关于单片机编程里面调用sprintf死机的解决方法及原因分析
349 0
|
11月前
|
运维 物联网 Linux
嵌入式linux之go语言开发(六)几行代码实现终端的远程日志诊断
嵌入式linux之go语言开发(六)几行代码实现终端的远程日志诊断
|
存储 NoSQL IDE
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(三)
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解
279 0
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(三)