7168浏览
查看: 7168|回复: 2

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

[复制链接]
本帖最后由 dafenqi5219 于 2017-5-16 21:12 编辑

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

length = sizeof(tune)/ sizeof(tune [0]);


然后书中给出的解释是:
Arduino从入门基础到实践书中 第十二个项目 蜂鸣器旋律发声图1


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

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


[mw_shl_code=c,true]#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[0]);
//        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[x]);
                delay(1500 * duration[x]);
                noTone(8);
        }
        delay(5000);
}
[/mw_shl_code]






































































dafenqi5219  见习技师
 楼主|

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

问题找到了sizeof(tune)也是测量的数组大小,而不是数组元素个数, 一般int类型的变量根据编译器的不通会出现不同的大小,我是用的是的c-free5.0 显示是占用四个字节
Arduino从入门基础到实践书中 第十二个项目 蜂鸣器旋律发声图1

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

length = sizeof(tune) / sizeof(tune[0]);

应该为 54/2 或者 108/4 (不同的编译环境int类型变量会有所不同) 但是肯定不是26/2
Arduino从入门基础到实践书中 第十二个项目 蜂鸣器旋律发声图2

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

使用道具 举报

dafenqi5219  见习技师
 楼主|

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

还有就是我在写的时候多写了一个本来应该是26个元素,然后我这里变成27个了Arduino从入门基础到实践书中 第十二个项目 蜂鸣器旋律发声图1



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail