|
безымянные struct и union, WinAVR |
|
|
|
Jul 28 2010, 07:31
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
расширение GNU для GCC вводит возможность задавать в структурах безымянные поля типа struct или union, например, так: Код typedef struct { uint8_t fix; union { uint8_t param; void *ptr; }; }flex_struct_t;
flex_struct_t rec; и потом в зависимости от условий обращаться rec.param или rec.ptr, как будто эти поля родные для структуры. все хорошо (если не считать того, что Eclipse такой записи не понимает и не подсказывает при вводе имена этих объединенных полей), пока не начинаешь запихивать такие структуры во flash: Код PROGMEM flex_struct_t fixed = {.fix=0, .param = 123}; приводит к ошибке unknown field 'param' specified in initializerвопрос, как обычно, традиционный: что делать? это баг или фича?
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jul 28 2010, 07:44
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(ARV @ Jul 28 2010, 11:31)  все хорошо (если не считать того, что Eclipse такой записи не понимает и не подсказывает при вводе имена этих объединенных полей), пока не начинаешь запихивать такие структуры во flash: Код PROGMEM flex_struct_t fixed = {.fix=0, .param = 123}; приводит к ошибке unknown field 'param' specified in initializerА если запихивать не в флешь? При обращении к полям нет ошибок? Если дать имя не только типу, но и структуре, то эклипс наверно начнёт "видеть" её поля. По крайней мере, в С::В именно так.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jul 28 2010, 07:49
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
а если попробовать проинитить так Код PROGMEM flex_struct_t fixed = {0, 123};
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Jul 28 2010, 07:57
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(dimka76 @ Jul 28 2010, 11:49)  а если попробовать проинитить так Код PROGMEM flex_struct_t fixed = {0, 123}; так можно, но выдается warning. зато так непонятно, что к чему инициализируется - от этого и хочется уйти Цитата(MrYuran @ Jul 28 2010, 11:54)  А если так: Код PROGMEM flex_struct_t fixed = {.fix=0, {.param = 123}}; В ТОЧКУ! спасибо! странно, что все-таки для обращения к полю не надо писать что-то типа rec..param - понимает же GCC, что поля надо достать из union-а...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jul 28 2010, 08:00
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(ARV @ Jul 28 2010, 11:57)  Цитата(dimka76 @ Jul 28 2010, 11:57)  Код PROGMEM flex_struct_t fixed = {0, 123}; так можно, но выдается warning. зато так непонятно, что к чему инициализируется - от этого и хочется уйти а что за предупреждение ?
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Jul 28 2010, 10:58
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(IgorKossak @ Jul 28 2010, 13:00)  Helios понимает и всё прекрасно показывает. Попробуйте покопаться в Preferences->C/C++->Editor->Content Assist->Advanced увы... не показывает у меня, и настройки не помогают. но, что гораздо хуже, я все равно в тупике с инициализаторами Код typedef struct { prog_char *text; uint8_t type; union{ struct { union{ uint8_t id; int *num; }; func_ptr func; }; struct { uint8_t vcnt; uint8_t *vid; prog_char **var; }; _tm submenu; }; } menu_item_t;
#define simple_item(t,i,f) {.text = t, .type = i_simple, {{{.id=i}, .func = f}}} #define int_item(t,n,f) {.text = t, .type = i_int, {{{.num = n}, .func = f}}} #define var_item(t,c,vi,v) {.text = t, .type = i_var,{ {.vcnt=0}} } #define sub_item(t,s) {.text = t, .type = i_sub, {.submenu = s}}
PROGMEM menu_t mainmenu = { .itemcount = 5, .items = { simple_item(m1,1,NULL), int_item(m2,&varvar,NULL), var_item(m3,3,&vi,&vars), simple_item(m4,1,NULL), simple_item(m5,2,NULL) } }; в этом куске: сначала структура с объединенными полями, затем макросы для инициализации разных вариантов этой структуры, в конце - массив элементов с разными вариантами. так вот, var_item() вызывает ошибку - не найдено поле vcnt - в чем дело, не пойму... все прочие варианты отрабатывают...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jul 29 2010, 10:30
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Код union{ uint8_t id; int *num; }; Вы пытаетесь объединить 16-ти битную переменную и 8-битную. Указатель в памяти занимает два байта. Код union{ struct { union{ uint8_t id; int *num; }; func_ptr func; }; struct { uint8_t vcnt; uint8_t *vid; prog_char **var; }; Здесь у вас тоже структуры разного размера
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|