Мы можем сделать это в одной строке кода, используя java 8
List ids = viewValues.stream().map(ViewValue::getId).collect(Collectors.toList());
. Для получения дополнительной информации: Java 8 - Потоки
Вам необходимо переслать объявление tuEntry
, чтобы вы могли использовать его в ts_EntrySubmenu
. Вам нужно будет дать имя тегу этому объединению, чтобы на него можно было ссылаться позже.
Кроме того, вы не можете инициализировать поле структуры или объединения по умолчанию, когда оно определено в C. Это поле необходимо установить в каждом соответствующем экземпляре.
typedef union tuEntry tuEntry;
typedef struct {
char* entryName;
const te_UIEntryType entryType; // no default value
tuEntry *entries[];
} ts_EntrySubmenu;
union tuEntry
{
tsEntry entry;
ts_EntryInt entryInt;
ts_EntrySingle entrySingle;
ts_EntryBool entryBool;
ts_EntryDiscrete entryDiscrete;
ts_EntrySubmenu entrySubmenu;
};
Объявление указателя на некоторый T
требует только того, чтобы было объявлено T
, а не обязательно определено. Так что просто сделайте это:
union Entry;
typedef struct {
char* entryName;
const te_UIEntryType entryType = UI_ENTRY_SUBMENU;
union Entry *entries[];
} ts_EntrySubmenu;
typedef union Entry {
/* as before */
} tsEntry;
Проблема в том, что элемент подменю является членом объединения, поэтому его необходимо определить до объединения.
blockquote>Да.
Но у него есть указатель на массив экземпляров этого объединения, что вызывает ошибку компиляции, потому что объединение еще не определено.
blockquote>Для объявления указателя на этот тип необязательно указывать объединение. Это должно быть только объявлено . Определение может прийти позже.
Существует ли типобезопасный способ справиться с этим, или мой указатель в записи подменю должен быть пустым *?
blockquote>Да. Форвард-объявлять объединение перед определением структуры, а потом помещать определение объединения. Это требует от вас предоставления тега для вашего типа объединения, иначе прямое объявление и последующее определение не будут ссылаться на тот же тип.
Пример:
typedef union entry tuEntry; typedef struct { // ... tuEntry *entries[]; } ts_EntrySubmenu; union entry { // ... ts_EntrySubmenu entrySubmenu; };
Кроме того, я не могу не заметить, что ваш исходный код полностью избегает объявления каких-либо тегов структуры или объединения. Я хочу убедиться, что вы понимаете, что это выбор стиля , и особенно, что ключевое слово
typedef
предназначено не для определения типов, а для объявления псевдонимов для имен типов. Ваш стиль по своей сути не ошибочен, но он не поддерживает то, что вы хотите сделать. Вам нужно использовать типы структуры и объединения с тегами, чтобы связать несколько объявлений одного и того же типа в одной и той же области видимости.