如何创建一个const结构数组

时间:2014-04-15 01:38:47

标签: c arrays struct

我希望能够轻松地创建具有特定信息的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结构添加到数组中。

还是我离开这里?枚举或MACROS会帮助我吗?

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

2 个答案:

答案 0 :(得分:4)

具有静态存储持续时间的变量必须在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 };

答案 1 :(得分:4)

你应该描述你得到的错误。试图自己编译导致:

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