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

作者在Proteus上运行代码时遇到问题,代码无法正常执行。经过排查,怀疑问题可能出在sprintf函数上,因为Proteus可能不完全支持此函数。尽管代码在实际硬件上运行无误,但sprintf涉及的动态分配和格式化操作可能在仿真环境中引发问题。建议避免在Proteus中使用可能导致缓冲区溢出的sprintf函数,或确保使用全局数组和适当的数据存储策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风正豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值