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

コードからわかるように、静的に割り当てられているが動的なサイズの配列を作成したいと思います。私はデータをループする方法を知っています。それはコンパイラが宣言でbarfsするということだけです。私がCソリューションを探している間、さらにC++のボーナスポイント。

ありがとう!

4

2 に答える 2

3

Cソリューションでは、内部配列を定義するために追加の変数が必要です。

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 ++ソリューション-requires-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   
于 2012-10-23T19:38:53.327 に答える
2

C ++ 11では、初期化リストを使用できます。DictionaryArrayこれらのいずれかを取るコンストラクターを使用してクラスを定義してから、次のように記述できます。

DictionaryArray myArray({ /* some list */ });
于 2012-10-23T19:36:54.103 に答える