2012-10-23 67 views
0
typedef struct DictionaryEntry_s { 
    char *key; 
    char *value; 
} DictionaryEntry; 

typedef struct Dictionary_s { 
    char *name; 
    DictionaryEntry values[0]; 
} Dictionary; 

//How can I do the following: 
Dictionary myDictionary[] = { 
    {"synonyms", 
     {"good", "cool"}, 
     {"bad", "evil"}, 
     {"awesome", "me"}, 
     {"like", "love"}, //etc.... 
     {0} //terminator 
    }, 
    {"antonyms", 
     {"good", "evil"}, 
     {"bad", "good"}, 
     {"awesome", "not me"}, ///...etc 
     {0} //terminator 
    }, 
    {0} //terminator 
}; 

正如你可以在代码中看到的,我想创建一个静态分配但动态大小的数组。我知道如何遍历数据,只是在编译器barf处声明。当我在寻找一个C解决方案时,C++的附加分。如何创建静态分配的动态大小的数组?

谢谢!

+1

**静态**分配**动态* *大小的数组... ...究竟是如何可能的(即使在机器级别,将语言语法放在一边)静态分配(即,在可执行初始化期间预先分配)在运行时已知的大小? – valdo

+0

@valdo看看这个例子。该结构的大小可变,但您可以通过查看声明来确定大小。 – chacham15

回答

3

℃溶液来需要额外的变量定义内部数组:

typedef struct DictionaryEntry_s { 
    char *key; 
    char *value; 
} DictionaryEntry; 

typedef struct Dictionary_s { 
    char *name; 
    DictionaryEntry* values; 
} Dictionary; 

//How can I do the following: 
DictionaryEntry myDictionary0[] = { 
     {"good", "cool"}, 
     {"bad", "evil"}, 
     {"awesome", "me"}, 
     {"like", "love"}, //etc.... 
     {0} //terminator 
}; 
Dictionary myDictionary[] = { 
    {"synonyms", myDictionary0}, 
    // ... 
    {0} //terminator 
}; // <-- semicolon was missing here 

C++的解决方案 - 需要std::vector<> - 但它不是statically分配,但动态的,它不需要终止符:

struct DictionaryEntry { 
    char *key; 
    char *value; 
}; 

struct Dictionary { 
    char *name; 
    std::vector<DictionaryEntry> values; 
}; 

//How can I do the following: 
Dictionary myDictionary[] = { 
    {"synonyms", 
     { 
     {"good", "cool"}, 
     {"bad", "evil"}, 
     {"awesome", "me"}, 
     {"like", "love"}, //etc.... 
     {0} //terminator 
     } 
    }, 
    //... 
    {0} //terminator 
}; // <-- semicolon was missing here 
+0

C解决方案不起作用:'警告:'DictionaryEntry [0] {又名DictionaryEntry_s [0]}'[-Wmissing-braces]''和'error:初始化程序中缺少大括号''字典'' – chacham15

+0

@ chacham15在myDisctionary后缺少分号(顺便说一句 - 从你的问题中复制错误),请参阅http://ideone.com/u08AtS – PiotrNycz

+0

即时通讯对不起,这是我的错,我错过了改变数值的事实到一个指针 – chacham15

2

在C++ 11中,您可以使用初始化程序列表。您可以定义一个DictionaryArray类与构造函数的其中之一,然后写

DictionaryArray myArray({ /* some list */ }); 
+1

我很确定他没有安装C++ 11的编译器。 +1 none-the-less –