標(biāo)題: code數(shù)組定義在其他C語言文件extern后無法正常調(diào)用的問題 [打印本頁]

作者: Carose    時間: 2021-6-18 21:30
標(biāo)題: code數(shù)組定義在其他C語言文件extern后無法正常調(diào)用的問題
本帖最后由 Carose 于 2021-6-19 14:01 編輯

最近做了一個52單片機(jī)板子的可愛的LCD顯示的音樂盒,能實(shí)現(xiàn)播放、暫停、切歌、停止并重新播放以及彈奏功能,并且會在LCD1602顯示狀態(tài)。
目前已經(jīng)基本開發(fā)完成,我們采用了多文件編程的形式,并且配了大量注釋,有很高的可移植性。目前嘗試完成升降調(diào)的開發(fā)。完成后考慮開源:P
但是我們開發(fā)過程中遇到過一些問:
  1. //以下為歌曲數(shù)據(jù)文件

  2. u16 code Astronomia[] =      //音階,第幾個八度(0,1,2,3),時值(八分音符為1),以0,0,0結(jié)尾才能循環(huán)
  3. {
  4.         NOTE(6,1,2), NOTE(6,1,1), NOTE(3,2,1), NOTE(2,2,2), NOTE(1,2,2), NOTE(7,1,2), NOTE(7,1,1), NOTE(7,1,1), NOTE(2,2,2),\
  5.         NOTE(1,2,1), NOTE(7,1,1), NOTE(6,1,2), NOTE(6,1,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1),\
  6.         NOTE(6,1,2), NOTE(6,1,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(6,1,2),        NOTE(6,1,1),\
  7.         NOTE(3,2,1), NOTE(2,2,2), NOTE(1,2,2), NOTE(7,1,2), NOTE(7,1,1), NOTE(7,1,1), NOTE(2,2,2), NOTE(1,2,1), NOTE(7,1,1),\
  8.         NOTE(6,1,2), NOTE(6,1,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(1,2,1), NOTE(1,2,1),\
  9.         NOTE(1,2,1), NOTE(1,2,1), NOTE(3,2,1), NOTE(3,2,1), NOTE(3,2,1), NOTE(3,2,1), NOTE(2,2,1), NOTE(2,2,1), NOTE(2,2,1),\
  10.         NOTE(2,2,1), NOTE(5,2,1), NOTE(5,2,1), NOTE(5,2,1), NOTE(5,2,1), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2),\
  11.         NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(2,2,1),\
  12.         NOTE(1,2,1), NOTE(7,1,1), NOTE(5,1,1), NOTE(6,1,2), NOTE(6,1,1), NOTE(3,2,1), NOTE(2,2,2), NOTE(1,2,2), NOTE(7,1,2),\
  13.         NOTE(7,1,1), NOTE(7,1,1), NOTE(2,2,2), NOTE(1,2,1), NOTE(7,1,1), NOTE(6,1,2), NOTE(6,1,1), NOTE(1,3,1), NOTE(7,2,1),\
  14.         NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(6,1,2), NOTE(6,1,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(7,2,1),\
  15.         NOTE(1,3,1), NOTE(6,1,2), NOTE(6,1,1), NOTE(3,2,1), NOTE(2,2,2), NOTE(1,2,2), NOTE(7,1,2), NOTE(7,1,1), NOTE(7,1,1),\
  16.         NOTE(2,2,2), NOTE(1,2,1), NOTE(7,1,1), NOTE(6,1,2), NOTE(6,1,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(7,2,1),\
  17.         NOTE(1,3,1), NOTE(1,3,1), NOTE(1,3,1), NOTE(1,3,1), NOTE(1,3,1), NOTE(3,3,1), NOTE(3,3,1), NOTE(3,3,1), NOTE(3,3,1),\
  18.         NOTE(2,3,1), NOTE(2,3,1), NOTE(2,3,1), NOTE(2,3,1), NOTE(5,3,1), NOTE(5,3,1), NOTE(5,3,1), NOTE(5,3,1), NOTE(6,3,2),\
  19.         NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2),\
  20.         NOTE(6,3,2), NOTE(6,3,2), NOTE(0,0,0)
  21. };
復(fù)制代碼
我們用u16 code存儲歌曲數(shù)據(jù)。本來在ROM這個文件夾里有musicLib這個c文件是打算用來存儲歌曲信息的。但是code定義的變量在主函數(shù)extern u16 code Astronomia[]后,編譯器不會報錯,但實(shí)際上并不能正常播放。必須將code 的數(shù)據(jù)全部移到main.c才能正常使用。這導(dǎo)致了main.c有三百多行代碼,我們自己看著也頭疼。

因此希望有相關(guān)開發(fā)經(jīng)驗或者了解keil編譯原理的大神能夠解釋一下這個問題,能否有相應(yīng)的解決方案。



結(jié)果見置頂帖

enlight.jpg (985.66 KB, 下載次數(shù): 50)

enlight

enlight

正面.jpg (2.34 MB, 下載次數(shù): 33)

正面

正面

背面.jpg (3.05 MB, 下載次數(shù): 36)

背面

背面

圖片1.png (121.88 KB, 下載次數(shù): 43)

keil界面,問題代碼所在

keil界面,問題代碼所在

作者: jjjjjjir    時間: 2021-6-19 08:59
將"musicLib.c"改為"musicLib.h",將數(shù)組Astronomia[]放入"musicLib.h"中,最后在“main.c”加上#include “"musicLib.h"
作者: Carose    時間: 2021-6-19 10:36
jjjjjjir 發(fā)表于 2021-6-19 08:59
將"musicLib.c"改為"musicLib.h",將數(shù)組Astronomia[]放入"musicLib.h"中,最后在“main.c”加上#include “ ...

感謝回復(fù),不過這么做是不是會導(dǎo)致這個h文件只能被include一次。
作者: hz_dyg    時間: 2021-6-19 12:11
在這個.c文件里,定義一個 u16 *pdata = &Astronomia[0];  然后頭文件里聲明這個extern u16 *pdata;




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1