【问题标题】:How to create an array of const structs如何创建一个 const 结构数组
【发布时间】:2014-04-15 01:38:46
【问题描述】:

我希望能够轻松地创建具有特定信息的 const 结构,因此决定“一次一行”声明和初始化它们,因此我可以根据需要简单地添加新的 const 结构。这很好用,但是如何创建某种数组来访问这些 const 结构中的每一个?我尝试了以下方法,但它不起作用。

typedef struct
{
    int numOfNotes;
    char *arpName;
    double freqRatios[12];
} ARPINFO;

const ARPINFO majorArp = {3,"Major Arpeggio",{0.0,JUST_MAJ_3,JUST_PERF_5}};
const ARPINFO minorArp = {3,"Minor Arpeggio",{0.0,JUST_MIN_3,JUST_PERF_5}};

const ARPINFO arpInfoArray[2] = {majorArp,minorArp}; // ERROR HERE

如果我可以使用这种组织结构的方式,我只需要更改数组的大小并将新的 const 结构添加到数组中,每次我创建一个新的 const 结构。

或者我在这里偏离了轨道?枚举或宏会帮助我吗?

编辑:freqRatios 是用宏定义的,我知道最初的 0.0 可能是多余的......

【问题讨论】:

    标签: c arrays struct


    【解决方案1】:

    具有静态存储持续时间的变量必须在 C 中具有编译时常量初始值设定项。另一个变量不算作编译时常量(即使该变量是 const)。

    你可以写:

    #define MAJOR_ARP {3,"Major Arpeggio",{0.0,JUST_MAJ_3,JUST_PERF_5}}
    #define MINOR_ARP {3,"Minor Arpeggio",{0.0,JUST_MIN_3,JUST_PERF_5}}
    
    const ARPINFO majorArp = MAJOR_ARP;
    const ARPINFO minorArp = MINOR_ARP;
    
    const ARPINFO arpInfoArray[2] = { MAJOR_ARP, MINOR_ARP };
    

    请注意,这有两个数据副本。如果您对拥有一份数据副本和引用它的其他静态变量感到满意,您可以改为:

    const ARPINFO *const arpInfos[2] = { &majorArp, &minorArp };
    

    【讨论】:

    • 是的,您可以只拥有数组并在拥有 enum { ID_MAJOR_ARP = 0 等的地方执行 arpInfoArray[ID_MAJOR_ARP]。在这种情况下,您不需要我的 MAJOR_ARP 等宏。
    • 这很好用,谢谢!我已经使用了枚举和数组解决方案。你的前几句话真的帮助我理解了我得到的警告(关于编译时间常数......)
    【解决方案2】:

    您应该描述您遇到的错误。尝试自己编译导致:

    main.cpp:14:33: error: initializer element is not a compile-time constant
    const ARPINFO arpInfoArray[2] = {majorArp,minorArp}; // ERROR HERE
                                    ^~~~~~~~~~~~~~~~~~~
    

    解决方案是:

    const ARPINFO arpInfoArray[2] = {
      {3,"Major Arpeggio",{0.0,JUST_MAJ_3,JUST_PERF_5}},
      {3,"Minor Arpeggio",{0.0,JUST_MIN_3,JUST_PERF_5}}
    };
    

    【讨论】:

    • 谢谢,这个答案也帮助了我。数组条目的布局特别有用,有效地允许我一次添加一行。抱歉没有包含编译器错误...
    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多