【问题标题】:Assigning rows of a static 2D array to another's rows将静态二维数组的行分配给另一个行
【发布时间】:2011-07-19 02:53:29
【问题描述】:

这是我目前所拥有的:

    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 足以避免两次输入实际值。

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

【问题讨论】:

    标签: c++ multidimensional-array notation


    【解决方案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 变成一个成熟的类,你可以用同样的方式将它们定义为局部变量或静态变量,但具有更高的类型安全性和更大的灵活性。然后,您可以在定义 progressionTwo 时以您想要的方式引用 progressionOne(至少您可以使用本地变量。使用全局变量,您可能会遇到 "static order initialization fiasco"

    【讨论】:

    • +1,领先 15 秒。一条评论,你可以#undef这些宏在使用后更安全。
    • 不是我所期望的那样,但这实际上工作得很好,尽管有邪恶的宏;)你可能也咬紧牙关写一个类是对的。
    猜你喜欢
    • 2018-09-03
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    相关资源
    最近更新 更多