2016-06-12 7 views
0

Выполняя свой проект, который должен использовать довольно сложные структуры, я чувствовал себя в диполе. Мне нужно объявить массив структур (меню), каждый из которых содержит массив структур (Элементы). В Visual Basic, из которого я пришел, он будет (упрощенно):C Массив структур из массива структур

type t_element 
    elementID as long 
    size as long 
    color as long 
end type 

Type t_Menu 
    menuID as long 
    numElements as long 
    elements() as t_element 
end type 

Dim Menus(10) as t_menu 
Redim Menus(1).elements(5) 

Я пытался что-то подобное в XC8 с:

typedef struct t_element 
{ 
    char eleID; 
    int size; 
    int color; 
}Element; 

typedef struct t_Menu 
{ 
    char IDmenu; 
    char elementNumber; 
    Element elements[]; 
}Menus; 

Надеясь, что это устроиства возможно, как я могу объявить массив элемента в меню?

Это не работает:

Menus Menu[10]; //this is OK 
Element Menu[1].elements[5]; //this is not 
Menu[1].(Element)elements[5]; //this is not 

Существует решение? Если да, что я делаю неправильно?

+0

'элемент е = Меню [1] .elements [5];'? – arrowd

+0

Элементы элемента []; '-> Элементы Element * и используют функции управления памятью, если ваша система их поддерживает. – MikeCAT

+0

@MikeCAT: 'elements []' является гибким членом массива и отлично подходит и наилучшим образом подходит при использовании динамического выделения. Нет необходимости в дополнительной косвенности. Это еще больше усложняет ситуацию. – Olaf

ответ

1

См доступ к элементам структур:

typedef struct t_element 
{ 
    char eleID; 
    int size; 
    int color; 
}Element; 

typedef struct t_Menu 
{ 
    char IDmenu; 
    char elementNumber; 
    Element elements[100]; 
}Menus; 

int main() 
{ 
    Menus menus[20]; 
    Element element1; 

    menus[5].elements[3].color = 1; 
    menus[5].elements[3].size = 2; 
    menus[5].elements[3].eleID ='a'; 
    menus[5].elementNumber = 1; 

    element1 = menus[5].elements[3]; 
    int color = element1.color; 

    printf("color for menus[5].elements[3]=%d",color); 

    return 0; 
} 
+0

Фактически объявление фиксированного (максимального) количества подэлементов внутри структуры меню было ответом, и я уже это сделал, к сожалению, я пропустил точка с запятой подряд, и это вызвало столько ошибок, что я не заметил оригинальной проблемы. – Orionis

Смежные вопросы