将静态 2D 数组的行分配给另一行



到目前为止我已经有了:

    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,
    };

这似乎是我在几轮修改我的符号,交换星号和调整类型定义中最接近的。我想要的,在上下文中应该很清楚,就是重新排列progressionTwo的行,得到progressionTwo。我不介意数据重复或繁琐的表示法——我只是希望足够DRY,以避免键入两次实际值。

…我真的需要抽出时间来阅读标准:/

如果您真的希望这些是简单的数组,您可以简单地为和弦创建#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转换为一个完整的类,您可以以相同的方式将它们定义为局部变量或静态变量,但是具有更多的类型安全性和灵活性。然后,您可以在定义progressionTwo的同时引用progressionOne,以您想要的方式(至少可以使用局部变量)。对于全局变量,您可能会遇到"静态订单初始化惨败")

最新更新