Присвоение строк статического 2D-массива другим строкам - PullRequest
0 голосов
/ 19 июля 2011

Вот что у меня есть:

    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.Я не возражаю против дублирования данных или зашифрованных обозначений - я просто хотел бы набрать DRY , чтобы не вводить действительные значения дважды.

... Мне действительно нужно найти время для чтения стандарта: /

1 Ответ

1 голос
/ 19 июля 2011

Если вы действительно хотите, чтобы это были простые массивы, вы можете просто создать макросы #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 нужным вам способом (по крайней мере, вы можете с местными. С глобальными переменными вы можете столкнуться с "фиаско статической инициализации порядка" )

...