c - typedef 音符枚举,制作将频率映射到音符的静态数组

标签 c enums typedef

我想在下面定义每个注释的枚举:

typedef enum
{
    NOTE_C0 = 0,
    NOTE_CS0,
    NOTE_D0,
    NOTE_DS0,
    NOTE_E0,
    NOTE_F0,
    NOTE_FS0,
    NOTE_G0,
    NOTE_GS0,
    NOTE_A0,
    NOTE_AS0,
    NOTE_B0,

    NOTE_C1,
    NOTE_CS1,
    NOTE_D1,
    NOTE_DS1,
    NOTE_E1,
    NOTE_F1,
    NOTE_FS1,
    NOTE_G1,
    NOTE_GS1,
    NOTE_A1,
    NOTE_AS1,
    NOTE_B1,

    NUM_NOTES
} note_t;

我想创建一个静态数组,将频率值映射到音符。

这是一项编程作业,出于某种原因,我不知道如何做到这一点。

static note_t noteList = {261.63,277.18, ...}; ?

会是这样吗?

最佳答案

只要您小心,您的建议的变体就可以在任何版本的 C: 中发挥作用

static double noteList[] = { 261.63, 277.18, … };

您需要根据枚举将频率定位在正确的索引处。稍后,您可以使用

printf("%.2f\n", noteList[NOTE_G0]);

打印中音 C 上方自然 G 对应的频率。

如果可以选择 C99 或更高版本,请考虑使用指定的初始值设定项:

static double frequencies[] =
{
    [NOTE_C0] = 261.63,
    [NOTE_CS0] = 277.18,
    [NOTE_D0] = …,
    [NOTE_DS0] = …,
    …
};

我已经更恰本地重命名了数组;您将使用的符号是数组符号。即使初始值设定项列表中存在间隙,此方法也有效;您会发现它们,因为某些索引的频率为零,而您期望的是非零频率。

关于c - typedef 音符枚举,制作将频率映射到音符的静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21961279/

相关文章:

c - 使用 distcc 编译失败,但不使用它也可以

java - 枚举当前设置的值

ios - 单例还是实用类?

c - 使用 .h 文件中声明的 C 类型

c++ - C++ 中带位域的匿名 typedef 的前向声明

c - 读取通用文件

c - 为什么我们可以同时使用函数指针作为 (*func_ptr)() 和 func_ptr() 来调用函数,但数组指针却不能呢?

c - 在 C 代码中使用 _wfopen 而不编写 BOM

ios - 如何使枚举可编码?

python - 在初始化时为模型提供枚举以进行属性转换