![]() |
發布時間: 2021-6-4 13:37
正文摘要:很奇怪 , 只是把變量名”h“改成了"l",程序運行就正常了, 到底問題在哪呢 編程器換了 CPU 也換過了還是同樣的現象 變量為名為"l"正常運行時最左面兩個數碼管到23后清零 變量名改成“h”十位始終 ... |
數組定義問題 |
老董 發表于 2021-6-6 20:47 數組越界,如果那個地址沒有被用到,則不會對程序造成影響,如果是另外一個變量的地址,則會把該變量的的內容給修改,造成數據錯誤甚至程序崩潰。 |
多謝各位大師指教 真的是數組越界了 本來寫程序的時候只想到了用時 ,分,秒,每個兩位數共六位數 把那兩個杠杠給忘了 越界了又不報錯 看來真是一點也不能馬虎 但是也沒搞懂 為何越界了會出現這樣的現象 |
npn 發表于 2021-6-5 16:05 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 |
liuzx66 發表于 2021-6-5 11:41 定義的變量: ![]() Keil為變量分配的內存地址: ![]() |
npn 發表于 2021-6-4 22:27 請舉例說明,不要誤導 |
Keil編譯時會將變量名進行字符串排序,小的會被分配到低地址,而不是行靠前的變量分配到低地址,把變量l改成h,就分配到其他地址去了。 再加上數組越界就會破壞其他變量,導致程序不能正常運行。 編譯后會生成一個M51格式的文件,什么數組、變量分配到什么地址,可以用記事本打開查看。 |
可以看一下,是不是定義出現問題 |
可能h這個變量重復定義了,或者后面碼代碼的時候沒有按照定義的變量來不小心打錯了,可以仔細再檢查一下,最后我建議樓主以后定義變量的時候盡量用多個字母定義,不行就用全拼嘛,這樣不容易搞混。 |
crrr 發表于 2021-6-4 15:42 亦有此疑問。 |
你的程序變量定義時,有個全局變量i,在函數中有定義了一個局部變量i,還有形參也用有i,太亂了,會出問題的。 |
變量名簡單或者復雜,對于編譯器來說,都是一樣的。編譯器不會對此有歧視 |
樓主會不會是重復定義了 |
老董 發表于 2021-6-4 14:16 樓主修改變量名時,是否將數字 1小 誤作小寫字母 i? 建議試試將變 量名改為大寫字母 L |
你試一下,每個變量定義時順便數值 =0;看會不會正常 |
改變變量名不會這樣,一定有其它的問題你沒找到。 |
![]() ![]() |
僅從貼出來的程序部分,看不出問題。 但值得吐槽的是你這變量名取得很不好。 |
最后兩位顯示其實不是99 是我想快速看到運行結果把時間調快了1000倍產生的快門暫留 |