Enums 使用自定义类型实现类似枚举的功能
我正在使用Teensy开发USB MIDI控制器。控制器是一行7个按钮,每个按钮都是一个级数,7个按钮组成一个和弦级数。按下时,设备会发送MIDI音符开/关消息以播放和弦 在我的代码中,我存储在一个枚举中: 我还有一系列和弦,如下所示:Enums 使用自定义类型实现类似枚举的功能,enums,arduino,hashtable,teensy,Enums,Arduino,Hashtable,Teensy,我正在使用Teensy开发USB MIDI控制器。控制器是一行7个按钮,每个按钮都是一个级数,7个按钮组成一个和弦级数。按下时,设备会发送MIDI音符开/关消息以播放和弦 在我的代码中,我存储在一个枚举中: 我还有一系列和弦,如下所示: struct Chord { String name; int tones[7]; }; Chord chords[6] = { { "maj", { INTERVAL::UNISON, INTERVAL::MAJOR_THI
struct Chord {
String name;
int tones[7];
};
Chord chords[6] = {
{ "maj", {
INTERVAL::UNISON,
INTERVAL::MAJOR_THIRD,
INTERVAL::PERFECT_FIFTH }
},
{ "min", {
INTERVAL::UNISON,
INTERVAL::MINOR_THIRD,
INTERVAL::PERFECT_FIFTH }
},
{ "maj7", {
INTERVAL::UNISON,
INTERVAL::MAJOR_THIRD,
INTERVAL::PERFECT_FIFTH,
INTERVAL::MAJOR_SEVENTH }
},
{ "min7", {
INTERVAL::UNISON,
INTERVAL::MINOR_THIRD,
INTERVAL::PERFECT_FIFTH,
INTERVAL::MINOR_SEVENTH }
},
{ "maj9", {
INTERVAL::UNISON,
INTERVAL::MAJOR_THIRD,
INTERVAL::PERFECT_FIFTH,
INTERVAL::MAJOR_SEVENTH,
INTERVAL::MAJOR_NINTH }
},
{ "min9", {
INTERVAL::UNISON,
INTERVAL::MINOR_THIRD,
INTERVAL::PERFECT_FIFTH,
INTERVAL::MINOR_SEVENTH,
INTERVAL::MINOR_NINTH }
}
};
我想以与音程枚举类似的方式访问和弦,这样我就可以执行类似于以下代码的操作:
void playChord(Chord chord, int velocity, int channel) {
int i;
for(i=0; i<chord.length; i++) {
usbMIDI.sendNoteOn(chord[i], velocity, channel);
}
}
playChord(Chord::MAJOR, 127, 1);
我知道不可能有一个自定义类型的枚举,但是有没有办法接近这个?我考虑过使用哈希表,但我必须从头开始实现它,如果我能帮上忙的话,我不希望这样做。枚举的要点是创建一个只能接受一组固定值的新类型。对间隔使用枚举是合适的,因为实际使用的间隔太少,而且创建新类型比在此处使用整型常量更方便 对于你的和弦来说,故事是不同的。您已经有了和弦的类型,因此将它们包装在另一个枚举类型中是没有帮助的。而且,和弦的数量远不是有限的。我手边的和弦图显示了22种形状,但不包括倒转。和弦结构比使用枚举人为限制和弦更合适 C还有两种机制来创建枚举以外的“常量”:预处理器定义和静态变量 通过预处理器指令,我们可以定义一个Chord文本。IIRC结构文本是C99的东西,以前只能有初始值设定项文本
#define CHORD_MAJOR ((Chord){"maj", {ROOT, MAJOR_THIRD, PERFECT_FIFTH}})
使用静态变量,可以在标头中声明对象:
static const Chord chord_major = {"maj", {ROOT, MAJOR_THIRD, PERFECT_FIFTH}};
请注意,C没有如下名称空间运算符::。相反,您必须自己为任何可能冲突的标识符添加前缀。C++确实有名称空间,但这并不影响这个答案中的点。< /P> < P>枚举的要点是创建一个只能接受固定值集的新类型。对间隔使用枚举是合适的,因为实际使用的间隔太少,而且创建新类型比在此处使用整型常量更方便 对于你的和弦来说,故事是不同的。您已经有了和弦的类型,因此将它们包装在另一个枚举类型中是没有帮助的。而且,和弦的数量远不是有限的。我手边的和弦图显示了22种形状,但不包括倒转。和弦结构比使用枚举人为限制和弦更合适 C还有两种机制来创建枚举以外的“常量”:预处理器定义和静态变量 通过预处理器指令,我们可以定义一个Chord文本。IIRC结构文本是C99的东西,以前只能有初始值设定项文本
#define CHORD_MAJOR ((Chord){"maj", {ROOT, MAJOR_THIRD, PERFECT_FIFTH}})
使用静态变量,可以在标头中声明对象:
static const Chord chord_major = {"maj", {ROOT, MAJOR_THIRD, PERFECT_FIFTH}};
请注意,C没有如下名称空间运算符::。相反,您必须自己为任何可能冲突的标识符添加前缀。C++确实有名称空间,但这并不影响这个答案中的点。