找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3105|回复: 24
收起左侧

C语言为何更改了一个变量名 程序运行就不对了

  [复制链接]
ID:849913 发表于 2021-6-4 13:37 | 显示全部楼层 |阅读模式
很奇怪 , 只是把变量名”h“改成了"l",程序运行就正常了, 到底问题在哪呢  编程器换了 CPU 也换过了还是同样的现象 变量为名为"l"正常运行时最左面两个数码管到23后清零 变量名改成“h”十位始终为零 个位到9就清零 下面程序里面标注了 “奇怪的地方“如果有开发板可以下载试一下   到底是为什么呢  难道是KEIL 或单片机的BUG吗?
  1. #include "reg52.h"                        

  2. typedef unsigned int u16;         
  3. typedef unsigned char u8;
  4. sbit LSA=P2^2;
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;


  7. u8 code smgduan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  8.                                         0x7f,0x6f,0x40};//显示0~F的值
  9. u8 time[6];
  10. u8 s,m,l;
  11. //u8 s,m,h;                          //奇怪的地方!!!!!!!
  12. u16 i=0,k=0;


  13. sbit led=P2^0;         //定义P20口是led
  14. void delay(u16 i)
  15. {
  16.         while(i--);        
  17. }

  18. void DigDisplay()
  19. {
  20.         u8 i;
  21.         for(i=0;i<8;i++)
  22.         {
  23.                 switch(i)         //位选,选择点亮的数码管,
  24.                 {
  25.                         case(0):
  26.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  27.                         case(1):
  28.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  29.                         case(2):
  30.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  31.                         case(3):
  32.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  33.                         case(4):
  34.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  35.                         case(5):
  36.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  37.                         case(6):
  38.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  39.                         case(7):
  40.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位        
  41.                 }
  42.                 P0=smgduan[time[i]];//发送段码
  43.                 delay(100); //间隔一段时间扫描        
  44.                 P0=0x00;//消隐
  45.         }
  46. }

  47. /*******************************************************************************
  48. * 函 数 名         : Timer0Init
  49. * 函数功能                   : 定时器0初始化
  50. * 输    入         : 无
  51. * 输    出         : 无
  52. *******************************************************************************/
  53. void Timer0Init()
  54. {
  55.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

  56.         TH0=0XFC;        //给定时器赋初值,定时1ms
  57.         TL0=0X18;        
  58.         ET0=1;//打开定时器0中断允许
  59.         EA=1;//打开总中断
  60.         TR0=1;//打开定时器                        
  61. }

  62. /*******************************************************************************
  63. * 函 数 名       : main
  64. * 函数功能                 : 主函数
  65. * 输    入       : 无
  66. * 输    出             : 无
  67. *******************************************************************************/
  68. void main()
  69. {        
  70.         Timer0Init();  //定时器0初始化
  71.         while(1)
  72.         {
  73.          

  74.                 if(s>59)
  75.                 {
  76.                          m++;
  77.                         s=0;

  78.                 }
  79.                 if(m>59)
  80.                 {
  81.                         l++;
  82.                         m=0;
  83.                 }
  84.                 if(l>23)
  85.                 {
  86.                         l=0;
  87.                 }

  88. /*
  89.                 if(m>59)                                   //奇怪的地方!!!!!!!
  90.                 {
  91.                         h++;
  92.                         m=0;
  93.                 }
  94.                 if(h>23)
  95.                 {
  96.                         h=0;
  97.                 }
  98.   */
  99.                
  100.                 time[0]=s%10;
  101.                 time[1]=s/10%6;
  102.                 time[2]=10;
  103.                 time[3]=m%10;
  104.                 time[4]=m/10%6;
  105.                 time[5]=10;
  106.                 time[6]=l%10;
  107.                 time[7]=l/10%10;
  108.         //        time[6]=h%10;                                        //奇怪的地方!!!!!!
  109.         //        time[7]=h/10%10;
  110.            DigDisplay();

  111.                


  112.         }        
  113.                         
  114. }

  115. /*******************************************************************************
  116. * 函 数 名         : void Timer0() interrupt 1
  117. * 函数功能                   : 定时器0中断函数
  118. * 输    入         : 无
  119. * 输    出         : 无
  120. *******************************************************************************/
  121. void Timer0() interrupt 1
  122. {
  123.    
  124.         TH0=0XFC;        //给定时器赋初值,定时1ms
  125.         TL0=0X18;
  126.         k++;
  127.         if(k==1)
  128.         {
  129.                 k=0;
  130.                 s++;
  131.                 led=!led;

  132.         }

  133. }
复制代码

51hei图片_20210604132226.jpg
回复

使用道具 举报

ID:849913 发表于 2021-6-4 13:41 | 显示全部楼层
最后两位显示其实不是99  是我想快速看到运行结果把时间调快了1000倍产生的快门暂留
回复

使用道具 举报

ID:236035 发表于 2021-6-4 14:04 | 显示全部楼层
仅从贴出来的程序部分,看不出问题。
但值得吐槽的是你这变量名取得很不好。
回复

使用道具 举报

ID:849913 发表于 2021-6-4 14:16 | 显示全部楼层
我还是个菜鸟 是不是变量名取得太简单了 把KEIL 弄蒙了
回复

使用道具 举报

ID:160500 发表于 2021-6-4 15:34 | 显示全部楼层
改变变量名不会这样,一定有其它的问题你没找到。
回复

使用道具 举报

ID:769980 发表于 2021-6-4 15:35 | 显示全部楼层
你试一下,每个变量定义时顺便数值 =0;看会不会正常
回复

使用道具 举报

ID:858964 发表于 2021-6-4 15:37 | 显示全部楼层
老董 发表于 2021-6-4 14:16
我还是个菜鸟 是不是变量名取得太简单了 把KEIL 弄蒙了

楼主修改变量名时,是否将数字 1小 误作小写字母 i?

建议试试将变 量名改为大写字母 L
回复

使用道具 举报

ID:918728 发表于 2021-6-4 15:42 | 显示全部楼层
楼主会不会是重复定义了
回复

使用道具 举报

ID:160500 发表于 2021-6-4 15:44 | 显示全部楼层
明显的time数组定义的小了

评分

参与人数 1黑币 +6 收起 理由
老董 + 6 很给力!

查看全部评分

回复

使用道具 举报

ID:160500 发表于 2021-6-4 15:49 | 显示全部楼层
变量名简单或者复杂,对于编译器来说,都是一样的。编译器不会对此有歧视
回复

使用道具 举报

ID:883031 发表于 2021-6-4 15:51 | 显示全部楼层
你的程序变量定义时,有个全局变量i,在函数中有定义了一个局部变量i,还有形参也用有i,太乱了,会出问题的。
回复

使用道具 举报

ID:858964 发表于 2021-6-4 15:52 | 显示全部楼层
crrr 发表于 2021-6-4 15:42
楼主会不会是重复定义了

亦有此疑问。
回复

使用道具 举报

ID:928028 发表于 2021-6-4 16:19 | 显示全部楼层
可能h这个变量重复定义了,或者后面码代码的时候没有按照定义的变量来不小心打错了,可以仔细再检查一下,最后我建议楼主以后定义变量的时候尽量用多个字母定义,不行就用全拼嘛,这样不容易搞混。
回复

使用道具 举报

ID:298123 发表于 2021-6-4 16:21 | 显示全部楼层
time[6]定义太小,数组访问越界了,误修改变量值了

评分

参与人数 1黑币 +6 收起 理由
老董 + 6 很给力!

查看全部评分

回复

使用道具 举报

ID:867005 发表于 2021-6-4 17:12 | 显示全部楼层
可以看一下,是不是定义出现问题
回复

使用道具 举报

ID:275826 发表于 2021-6-4 20:24 | 显示全部楼层
因为time[6]定义太小

评分

参与人数 1黑币 +6 收起 理由
老董 + 6 很给力!

查看全部评分

回复

使用道具 举报

ID:57657 发表于 2021-6-4 22:27 | 显示全部楼层
Keil编译时会将变量名进行字符串排序,小的会被分配到低地址,而不是行靠前的变量分配到低地址,把变量l改成h,就分配到其他地址去了。
再加上数组越界就会破坏其他变量,导致程序不能正常运行。
编译后会生成一个M51格式的文件,什么数组、变量分配到什么地址,可以用记事本打开查看。
回复

使用道具 举报

ID:213173 发表于 2021-6-5 10:47 | 显示全部楼层
无标题.jpg

评分

参与人数 1黑币 +6 收起 理由
老董 + 6 很给力!

查看全部评分

回复

使用道具 举报

ID:160500 发表于 2021-6-5 11:41 | 显示全部楼层
npn 发表于 2021-6-4 22:27
Keil编译时会将变量名进行字符串排序,小的会被分配到低地址,而不是行靠前的变量分配到低地址,把变量l改 ...

请举例说明,不要误导
回复

使用道具 举报

ID:57657 发表于 2021-6-5 16:05 | 显示全部楼层
liuzx66 发表于 2021-6-5 11:41
请举例说明,不要误导

定义的变量:
1.png
Keil为变量分配的内存地址:

2.png




回复

使用道具 举报

ID:160500 发表于 2021-6-5 19:02 | 显示全部楼层
npn 发表于 2021-6-5 16:05
定义的变量:

Keil为变量分配的内存地址:

keil的内存分配并不是简单的按字符的顺序来的,对于这种简单的程序这样排列不难理解,对于大的程序,变量名不是单一字符的内存分配并不是这样。你可以去实验。
这是一个编译的内存分配,你看看。
  D:000AH         PUBLIC        Sec_Count
  D:000CH         PUBLIC        jaA
  D:000DH         PUBLIC        RealTimeFlow
  D:000EH         PUBLIC        aas
  D:000FH         PUBLIC        accFlow
  D:0011H         PUBLIC        Flowrate
  D:0012H         PUBLIC        c
  D:0013H         PUBLIC        d
  D:0014H         PUBLIC        e
  D:0015H         PUBLIC        f
  D:0016H         PUBLIC        g
  D:0017H         PUBLIC        h
  D:0018H         PUBLIC        i
  D:0019H         PUBLIC        b321
回复

使用道具 举报

ID:933551 发表于 2021-6-5 21:56 | 显示全部楼层
u8 time[6];数组访问越界了,适逢地址的变量会被意外改写。

评分

参与人数 1黑币 +6 收起 理由
老董 + 6 很给力!

查看全部评分

回复

使用道具 举报

ID:849913 发表于 2021-6-6 20:47 | 显示全部楼层
多谢各位大师指教 真的是数组越界了  本来写程序的时候只想到了用时 ,分,秒,每个两位数共六位数  把那两个杠杠给忘了  越界了又不报错  看来真是一点也不能马虎  但是也没搞懂 为何越界了会出现这样的现象  
回复

使用道具 举报

ID:160500 发表于 2021-6-7 10:59 | 显示全部楼层
老董 发表于 2021-6-6 20:47
多谢各位大师指教 真的是数组越界了  本来写程序的时候只想到了用时 ,分,秒,每个两位数共六位数  把那两 ...

数组越界,如果那个地址没有被用到,则不会对程序造成影响,如果是另外一个变量的地址,则会把该变量的的内容给修改,造成数据错误甚至程序崩溃。
回复

使用道具 举报

ID:808634 发表于 2021-6-7 12:27 | 显示全部楼层
数组定义问题
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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