可以实操的代码,却在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毕竟只是一个仿真软件,很可能与实际情况并不相符合。所以,建议一切以实际情况为标准。

你可能感兴趣的:(电路设计,proteus)