Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Enums 使用自定义类型实现类似枚举的功能_Enums_Arduino_Hashtable_Teensy - Fatal编程技术网

Enums 使用自定义类型实现类似枚举的功能

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

我正在使用Teensy开发USB MIDI控制器。控制器是一行7个按钮,每个按钮都是一个级数,7个按钮组成一个和弦级数。按下时,设备会发送MIDI音符开/关消息以播放和弦

在我的代码中,我存储在一个枚举中:

我还有一系列和弦,如下所示:

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++确实有名称空间,但这并不影响这个答案中的点。