久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4710|回復: 24
打印 上一主題 下一主題
收起左側

C語言為何更改了一個變量名 程序運行就不對了

  [復制鏈接]
跳轉到指定樓層
樓主
很奇怪 , 只是把變量名”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 (109.62 KB, 下載次數: 106)

51hei圖片_20210604132226.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:849913 發表于 2021-6-4 13:41 | 只看該作者
最后兩位顯示其實不是99  是我想快速看到運行結果把時間調快了1000倍產生的快門暫留
回復

使用道具 舉報

板凳
ID:236035 發表于 2021-6-4 14:04 | 只看該作者
僅從貼出來的程序部分,看不出問題。
但值得吐槽的是你這變量名取得很不好。
回復

使用道具 舉報

地板
ID:849913 發表于 2021-6-4 14:16 | 只看該作者
我還是個菜鳥 是不是變量名取得太簡單了 把KEIL 弄蒙了
回復

使用道具 舉報

5#
ID:160500 發表于 2021-6-4 15:34 | 只看該作者
改變變量名不會這樣,一定有其它的問題你沒找到。
回復

使用道具 舉報

6#
ID:769980 發表于 2021-6-4 15:35 | 只看該作者
你試一下,每個變量定義時順便數值 =0;看會不會正常
回復

使用道具 舉報

7#
ID:858964 發表于 2021-6-4 15:37 | 只看該作者
老董 發表于 2021-6-4 14:16
我還是個菜鳥 是不是變量名取得太簡單了 把KEIL 弄蒙了

樓主修改變量名時,是否將數字 1小 誤作小寫字母 i?

建議試試將變 量名改為大寫字母 L
回復

使用道具 舉報

8#
ID:918728 發表于 2021-6-4 15:42 | 只看該作者
樓主會不會是重復定義了
回復

使用道具 舉報

9#
ID:160500 發表于 2021-6-4 15:44 | 只看該作者
明顯的time數組定義的小了

評分

參與人數 1黑幣 +6 收起 理由
老董 + 6 很給力!

查看全部評分

回復

使用道具 舉報

10#
ID:160500 發表于 2021-6-4 15:49 | 只看該作者
變量名簡單或者復雜,對于編譯器來說,都是一樣的。編譯器不會對此有歧視
回復

使用道具 舉報

11#
ID:883031 發表于 2021-6-4 15:51 | 只看該作者
你的程序變量定義時,有個全局變量i,在函數中有定義了一個局部變量i,還有形參也用有i,太亂了,會出問題的。
回復

使用道具 舉報

12#
ID:858964 發表于 2021-6-4 15:52 | 只看該作者
crrr 發表于 2021-6-4 15:42
樓主會不會是重復定義了

亦有此疑問。
回復

使用道具 舉報

13#
ID:928028 發表于 2021-6-4 16:19 | 只看該作者
可能h這個變量重復定義了,或者后面碼代碼的時候沒有按照定義的變量來不小心打錯了,可以仔細再檢查一下,最后我建議樓主以后定義變量的時候盡量用多個字母定義,不行就用全拼嘛,這樣不容易搞混。
回復

使用道具 舉報

14#
ID:298123 發表于 2021-6-4 16:21 | 只看該作者
time[6]定義太小,數組訪問越界了,誤修改變量值了

評分

參與人數 1黑幣 +6 收起 理由
老董 + 6 很給力!

查看全部評分

回復

使用道具 舉報

15#
ID:867005 發表于 2021-6-4 17:12 | 只看該作者
可以看一下,是不是定義出現問題
回復

使用道具 舉報

16#
ID:275826 發表于 2021-6-4 20:24 | 只看該作者
因為time[6]定義太小

評分

參與人數 1黑幣 +6 收起 理由
老董 + 6 很給力!

查看全部評分

回復

使用道具 舉報

17#
ID:57657 發表于 2021-6-4 22:27 | 只看該作者
Keil編譯時會將變量名進行字符串排序,小的會被分配到低地址,而不是行靠前的變量分配到低地址,把變量l改成h,就分配到其他地址去了。
再加上數組越界就會破壞其他變量,導致程序不能正常運行。
編譯后會生成一個M51格式的文件,什么數組、變量分配到什么地址,可以用記事本打開查看。
回復

使用道具 舉報

18#
ID:213173 發表于 2021-6-5 10:47 | 只看該作者

評分

參與人數 1黑幣 +6 收起 理由
老董 + 6 很給力!

查看全部評分

回復

使用道具 舉報

19#
ID:160500 發表于 2021-6-5 11:41 | 只看該作者
npn 發表于 2021-6-4 22:27
Keil編譯時會將變量名進行字符串排序,小的會被分配到低地址,而不是行靠前的變量分配到低地址,把變量l改 ...

請舉例說明,不要誤導
回復

使用道具 舉報

20#
ID:57657 發表于 2021-6-5 16:05 | 只看該作者
liuzx66 發表于 2021-6-5 11:41
請舉例說明,不要誤導

定義的變量:

Keil為變量分配的內存地址:






回復

使用道具 舉報

21#
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
回復

使用道具 舉報

22#
ID:933551 發表于 2021-6-5 21:56 | 只看該作者
u8 time[6];數組訪問越界了,適逢地址的變量會被意外改寫。

評分

參與人數 1黑幣 +6 收起 理由
老董 + 6 很給力!

查看全部評分

回復

使用道具 舉報

23#
ID:849913 發表于 2021-6-6 20:47 | 只看該作者
多謝各位大師指教 真的是數組越界了  本來寫程序的時候只想到了用時 ,分,秒,每個兩位數共六位數  把那兩個杠杠給忘了  越界了又不報錯  看來真是一點也不能馬虎  但是也沒搞懂 為何越界了會出現這樣的現象  
回復

使用道具 舉報

24#
ID:160500 發表于 2021-6-7 10:59 | 只看該作者
老董 發表于 2021-6-6 20:47
多謝各位大師指教 真的是數組越界了  本來寫程序的時候只想到了用時 ,分,秒,每個兩位數共六位數  把那兩 ...

數組越界,如果那個地址沒有被用到,則不會對程序造成影響,如果是另外一個變量的地址,則會把該變量的的內容給修改,造成數據錯誤甚至程序崩潰。
回復

使用道具 舉報

25#
ID:808634 發表于 2021-6-7 12:27 | 只看該作者
數組定義問題
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 毛片一区二区三区 | 成人在线免费视频观看 | 国产精品一区二区三区在线 | 国产精品美女久久久久aⅴ国产馆 | 国产一区二区三区四区三区四 | 国产精品99久久久精品免费观看 | 欧美一级二级三级视频 | 国产ts人妖系列高潮 | 欧美日日| 亚州影院 | av网址在线 | 91精品国产综合久久久久久丝袜 | 欧美女优在线观看 | 激情五月综合 | 日韩三级免费观看 | 超碰520 | 91成人在线视频 | 国产又爽又黄的视频 | 91免费在线看 | 成人精品久久久 | 免费一区 | 911网站大全在线观看 | 亚洲福利免费 | 国产精品国产精品国产专区不卡 | 亚洲精品一区中文字幕乱码 | 亚洲成人精选 | 亚洲免费观看视频 | 久久大香 | 日韩中文字幕视频在线 | 国产欧美一级 | 亚洲一区自拍 | 国产一区二区免费电影 | 亚洲高清在线观看 | 精品欧美乱码久久久久久1区2区 | 中文字幕一区二区在线观看 | 国产精品免费一区二区三区四区 | 久久久久无码国产精品一区 | 日韩视频专区 | 国产精品综合网 | 亚洲一区二区久久 | 国产欧美在线视频 |