0

这是我到目前为止所拥有的:

    typedef const float Chord[6];

    static Chord progressionOne[] = {
        {5.0f / 6.0f, 1.0, 1.25, 5.0f / 3.0f, 2.0, 2.5},         // i
        {5.0f / 6.0f, 2.0f / 3.0f, 1.0, 4.0f / 3.0f, 5.0f / 3.0f, 2.0}, // VI
        {0.75, 1.0, 1.25, 1.5, 2.0, 2.5},                       // III
        {1.125, 1.5, 1.875, 2.25, 3.0, 3.75}                      // VII
    };

    static Chord progressionTwo[] = {
        progressionOne + 1, //VI
        progressionOne + 3, //VII
        progressionOne + 0, // i
        progressionOne + 0,
    };

这似乎是我在几轮按摩我的符号、交换星号和调整 typedef 中能得到的最接近的结果。我想要的,希望在上下文中很清楚,是重新排列progressionTwo的行,产生progressionTwo. 我不介意数据重复或毛茸茸的符号——我只想足够以避免两次输入实际值。

...我真的需要阅读标准:/

4

1 回答 1

1

如果您真的希望这些是简单的数组,您可以简单地#define为和弦创建宏(预处理器定义),并让进程引用这些和弦:

typedef const float Chord[6];

#define CHORD_I { 5.0f / 6.0f, 1.0, 1.25, 5.0f / 3.0f, 2.0, 2.5 }
#define CHORD_VI { 5.0f / 6.0f, 2.0f / 3.0f, 1.0, 4.0f / 3.0f, 5.0f / 3.0f, 2.0 }
#define CHORD_III { 0.75, 1.0, 1.25, 1.5, 2.0, 2.5 }
#define CHORD_VII { 1.125, 1.5, 1.875, 2.25, 3.0, 3.75 }

const Chord progressionOne[] = {
    CHORD_I,
    CHORD_VI,
    CHORD_III,
    CHORD_VII,
};

const Chord progressionTwo[] = {
    CHORD_VI,
    CHORD_VII,
    CHORD_I,
    CHORD_I,
};

但是,预处理器定义很混乱。

如果你Chord变成一个成熟的类,你可以以同样的方式将它们定义为局部变量或静态变量,但具有更高的类型安全性和更大的灵活性。然后你可以progressionOne在定义progressionTwo你想要的方式时参考(至少你可以使用本地人。使用全局,你可能会遇到“静态订单初始化惨败”

于 2011-07-19T03:06:27.300 回答