找回密码
 立即注册
查看: 455|回复: 7

C51程序局部变量赋值错误!

[复制链接]

2

主题

1

回帖

28

积分

新手上路

积分
28
发表于 2024-7-23 08:45:46 | 显示全部楼层 |阅读模式
屏幕截图 2024-07-22 141736.png

屏幕截图 2024-07-22 142152.png

搞不懂为什么会出现这样的情况。造成了死循环。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-7-23 09:26:17 | 显示全部楼层
你这里设置了reentrant ,,,那么相关的配置修改了么0.0
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:424
  • 最近打卡:2025-05-02 14:37:11
已绑定手机

77

主题

4849

回帖

8382

积分

超级版主

DebugLab

积分
8382
发表于 2024-7-23 10:49:17 | 显示全部楼层
用while(1)循环,然后满足条件break呢?
感觉尽量少使用可重入函数比较好
DebugLab
回复 支持 反对

使用道具 举报 送花

2

主题

1

回帖

28

积分

新手上路

积分
28
发表于 2024-7-23 11:55:56 | 显示全部楼层
Debu*** 发表于 2024-7-23 10:49
用while(1)循环,然后满足条件break呢?
感觉尽量少使用可重入函数比较好

嗯,还是用的while。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-7-23 22:29:01 | 显示全部楼层
本帖最后由 tzz1983 于 2024-7-23 22:30 编辑

先去设置一下 启动文件 A51, 跟据编译模式, 打开 IBP, XBP, 相关的功能正确设置.  如果还是不行,反汇编看一下. 应该很快能找到原因
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-05-02 09:56:03

19

主题

137

回帖

489

积分

中级会员

积分
489
发表于 2024-7-24 11:08:37 | 显示全部楼层
是很蹊跷,楼主搞好了过来说一声,感觉挺奇怪的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-7-25 01:24:39 | 显示全部楼层
(1)首先给出正确用法:将“初值语句”改为正常的“变量定义语句”+“赋值语句”即可:

char ns;
------
   ns=0;
-------
(2)其次说明:在可重入函数中用初值语句给局部变量赋初始值是一种像裹小脚一样的陋习,可惜满大街的教科书和范例中比比皆是。
(3)再其次祝贺楼主中奖了:C语言有一些著名的“不确定问题”,这是其中的一个
所谓不确定问题是指对同一个C语言程序,它的意义不同的人有不同的理解,并且使用不同的编译器进行实际运行会到不同的结果
(4)有些C语言的不确定问题通过抽象强制的语法规则来消除不确定性,这些已成为C语言等级考试的嘚瑟亮点,比如:Z=X+++Y;
究竟是Z=(X++)+Y;还是Z=X+(++Y);呢,正确答案是前者。
(5)似乎加括号就可以了,但是:
X=1;
Z=(X++)+(X++)+(X++);
请问Z等于几?不同的编译器得到的结果不同,不同的读者给出的结果也不同.
不信的可以去试试C51、C251、MDKVC、TC、BC和GCC,看看是不是一样。感兴趣的可以把结果分享上来。
(6)最后回到本篇问题:当楼主在写出初值语句“char ns=0;”的时候,楼主心里是怎么想的?
是想在“main”函数执行前执行一次“ns=0”呢?还是想“main”函数执行时执行一次“ns=0”呢?
又或者是想在“food”函数第一次执行开始时执行一次“ns=0”呢?还是在“food”函数每次开始执行时都执行一次“ns=0”呢?

既然有4种可能,Keil编译器怎么能猜中楼主的心呢,当然猜错总是难免的了
(7)我猜想楼主和大多数人的想法都是:在“food”函数每次开始执行时都执行一次“ns=0”,
因此就给出了本楼开始的答案,在“food”函数一开始就直接来一句“ns=0;”,这样就不会有任何异议了。
当然我也有可能猜错,前面给出的答案就不一定正确。
(8)由于设计时我确定“长缨351”C语言编译器的语法要像GCC和VC等C语言一样,所有函数都是可重入的,因此我写的时候很多次的想拒绝支持“局部变量的初始值语句”,但是我看到众多的教科书中都有这种语句,因此才保留了这个语句。不过为了避免歧义,我将每个初始值语句像(1)中的例子那样,都分解为一个变量定义语句和一个赋值语句,确保每次函数访问时都变量的值确实为初始值。




回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:322
  • 最近打卡:2025-05-02 10:02:36
已绑定手机

21

主题

487

回帖

1041

积分

金牌会员

积分
1041
发表于 2025-1-7 17:12:11 | 显示全部楼层
长知识了
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 20:42 , Processed in 0.121886 second(s), 98 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表