Удивительная ошибка при инициализации структур - C (СИ)
Формулировка задачи:
Вот так работает нормально:
Вот так тоже:
И даже вот так:
А вот так "missing }":
Моя логика отказывается это понимать(((
struct SMenu
{
char *MenuItems[],Id,Sel,Len;
struct SMenu *Parent;
};
#define MLen(M) sizeof((M).MenuItems)/sizeof(char*)
struct SMenu M0={{"123","456","678"},0,0,MLen(M0),&M0};
struct SMenu M01={{"qqqq","www","eee"},0,0,MLen(M01),&M0};struct SMenu
{
char *MenuItems[],Id,Sel,Len;
struct SMenu *Parent;
};
#define MLen(M) sizeof((M).MenuItems)/sizeof(char*)
struct SMenu M0={{"123","456","678","9100"},0,0,MLen(M0),&M0};
struct SMenu M01={{"qqqq","www","eee"},0,0,MLen(M01),&M0};struct SMenu
{
char *MenuItems[],Id,Sel,Len;
struct SMenu *Parent;
};
#define MLen(M) sizeof((M).MenuItems)/sizeof(char*)
struct SMenu M0={{"123","456","678","9100"},0,0,MLen(M0),&M0};
struct SMenu M01={{"qqqq","www","eee","rrrr"},0,0,MLen(M01),&M0};struct SMenu
{
char *MenuItems[],Id,Sel,Len;
struct SMenu *Parent;
};
#define MLen(M) sizeof((M).MenuItems)/sizeof(char*)
struct SMenu M0={{"123","456","678"},0,0,MLen(M0),&M0};
struct SMenu M01={{"qqqq","www","eee","rrrr"},0,0,MLen(M01),&M0};Решение задачи: «Удивительная ошибка при инициализации структур»
textual
Листинг программы
struct SMenu
{
const char **MenuItems;
char Id,Sel,Len;
struct SMenu *Parent;
};
#define ARRAY_SIZE(a) (sizeof (a) / sizeof *(a))
#define MENU_INIT(id, sel, parent, items) { items, id, sel, ARRAY_SIZE(items), parent }
static const char *M0_Items[] = { "123", "456", "678" };
struct SMenu M0 = MENU_INIT(0, 0, &M0, M0_Items);
static const char *M01_Items[] = { "qqqq", "www", "eee" };
struct SMenu M01 = MENU_INIT(0, 0, &M0, M01_Items);
Объяснение кода листинга программы
- Структура
SMenubсодержит поля:MenuItems- указатель на массив строк,Id- идентификатор меню,Sel- флаг выбора,Len- длина строки меню,Parent- указатель на родительское меню. - Макросы
ARRAY_SIZEиMENU_INITиспользуются для инициализации структурSMenub. - Массив
M0_Itemsсодержит строки123,456,678. - Массив
M01_Itemsсодержит строкиqqqq,www,eee. - Переменная
M0инициализируется с использованием макросаMENU_INITс указанием идентификатора, флага выбора, указателя на родительское меню и массива строк. - Переменная
M01инициализируется с использованием макросаMENU_INITс указанием идентификатора, флага выбора, указателя на родительское меню и массива строк.