dafenqi5219 发表于 2017-5-16 19:40:19

Arduino从入门基础到实践书中 第十二个项目 蜂鸣器旋律发声

本帖最后由 dafenqi5219 于 2017-5-16 21:12 编辑

在《Arduino入基础到实践》书中第十二个项目中我有一点不明白就是为什么取得长度要为数组个数的一半

length = sizeof(tune)/ sizeof(tune );


然后书中给出的解释是:



在播放的时,数组有26个元素只调取了一半13个元素,不太明为什么要这样处理

      for (int x = 0; x < length; x++)
      {
                tone (8, tune);
                delay(1500 * duration);
                noTone(8);
      }
      delay(5000);


#include "Arduino.h"

//项目12蜂鸣器发声旋律演奏
#define NOTE_C3                131
#define NOTE_CS3      139
#define NOTE_D3                147
#define NOTE_DS3      156
#define NOTE_E3                165
#define NOTE_F3                175
#define NOTE_FS3      185
#define NOTE_G3                196
#define NOTE_GS3      208
#define NOTE_A3                220
#define NOTE_AS3      233
#define NOTE_B3                247
#define NOTE_C4                262
#define NOTE_CS4      277
#define NOTE_D4                294
#define NOTE_DS4      311
#define NOTE_E4                330
#define NOTE_F4                349
#define NOTE_FS4         370
#define NOTE_G4                392
#define NOTE_GS4      415
#define NOTE_A4                440
#define NOTE_AS4      466
#define NOTE_B4                494

#define WHOLE                1
#define HALF                0.5
#define QUARTER                0.25
#define EIGHTH                0.125
#define SIXTEENTH      0.0625

int tune[] = { NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_B3, NOTE_G3,
                                 NOTE_A3, NOTE_C4, NOTE_C4, NOTE_G3, NOTE_G3, NOTE_G3, NOTE_F3, NOTE_F3, NOTE_G3, NOTE_F3,
                                 NOTE_E3, NOTE_G3, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_A3, NOTE_B3, NOTE_B3, NOTE_C4, NOTE_D4

                                 };
float duration[] = { EIGHTH, QUARTER+EIGHTH, SIXTEENTH, QUARTER, QUARTER, HALF,
                                       HALF, HALF, QUARTER, QUARTER, HALF+QUARTER, QUARTER, QUARTER, QUARTER,
                                       QUARTER, QUARTER, QUARTER, HALF+QUARTER
                                        };

int length;

//The setup function is called once at startup of the sketch
void setup()
{
// Add your initialization code here
      pinMode(8, OUTPUT);
      length = sizeof(tune) / sizeof(tune);
//      length = sizeof(tune);
}

// The loop function is called in an endless loop
void loop()
{
//Add your repeated code here
      for (int x = 0; x < length; x++)
      {
                tone (8, tune);
                delay(1500 * duration);
                noTone(8);
      }
      delay(5000);
}







































































dafenqi5219 发表于 2017-5-16 21:47:19

问题找到了sizeof(tune)也是测量的数组大小,而不是数组元素个数, 一般int类型的变量根据编译器的不通会出现不同的大小,我是用的是的c-free5.0 显示是占用四个字节


所以求出的length是得出数组的元素个数

length = sizeof(tune) / sizeof(tune);

应该为 54/2 或者 108/4 (不同的编译环境int类型变量会有所不同) 但是肯定不是26/2


这本书写错了大家有没有发现。

dafenqi5219 发表于 2017-5-16 21:55:50

还有就是我在写的时候多写了一个本来应该是26个元素,然后我这里变成27个了



页: [1]
查看完整版本: Arduino从入门基础到实践书中 第十二个项目 蜂鸣器旋律发声