2016-07-24 111 views
0

我正在寫一個小程序,在蜂鳴器上播放一首歌曲。 我正在創建一個期望二維數組的函數。 該數組可以包含無限行和兩個coloumns。 第一列包含一個先前定義的常數,它是音符的頻率,第二列是長度。Arduino通過多維陣列

我googled如何傳遞一個數組到一個函數,我想我正在做,因爲我讀,但由於某種原因,該函數什麼都不做。 正如我想出添加一些Serial.print()調用,我發現該函數看到一個0長度的數組。

//Definitons of frequencies and pinout and tempo 

... 

unsigned int mySong[][2]{ 

         {G2, 2}, 
         {B2, 1}, 
         {D3, 1}, 
         {G3, 2} 

        }; 

void playSong(unsigned int song[][2]) 
{ 
    Serial.println(sizeof(song)/sizeof(song[0])); 

    for(int i = 0; i<sizeof(song)/sizeof(song[0]); i++) 
    { 
    tone(buzzerPin, song[i][0], (song[i][1]*tempo)); 
    Serial.println(song[i][0]);Serial.println(song[i][1]); 
    delay(song[i][1]*tempo); 
    } 
} 

void setup() { 
    pinMode(buzzerPin, OUTPUT); 
    Serial.begin(9600); 
} 

void loop() { 
    playSong(mySong); 
} 

但是,如果我改變每「歌」到「mySong」,它工作正常,並播放音樂和串口監視器讀數是正確的,所以建議我找到出路應該是不錯的,數組和常量也應該正常工作,所以當我將它傳遞給函數時,數據會丟失。

我可能會做錯什麼?

在此先感謝您的幫助。

回答

1

當將數組作爲參數傳遞給函數時,數組衰減到指針到它們的第一個元素。所以,即使你寫

void playSong(unsigned int song[][2]) 

編譯器會將其視爲

void playSong(unsigned int (*song)[2]) 

這意味着,做sizeof(song)將無法​​正常工作,因爲你那麼將得到指針的大小,而不是數據它指向。你需要傳遞的第一個「尺寸」作爲參數,以及:

void playSong(unsigned int song[][2], size_t num_elements) 

然後,當你通話playSong功能,您可以使用sizeof「絕招」來獲得元素的數量(如果只有如果它是一個實際的陣列,而不是一個指針):

playSong(mySong, sizeof mySong/sizeof mySong[0]); 
+0

非常感謝,它解決了這個問題。 :) – dagoston93

0

二維陣列僅在大多數情況下,scond最佳選擇。 我更喜歡擁有專用物品的一維數組。

struct Tone {unsigned int freq; byte duration;}; 
Tone mySong[] { 
      {G2, 2}, 
      {B2, 1}, 
      {D3, 1}, 
      {G3, 2} 
}; 

當然,Joachim在提供Tone song []參數時對未知大小的回覆也是如此。 提供元素數量作爲額外參數,或定義一個

const Tone EndOfSong {0,0};