2016-07-24 89 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};