реклама на сайте
подробности

 
 
> безымянные struct и union, WinAVR
ARV
сообщение Jul 28 2010, 07:31
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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

вопрос, как обычно, традиционный: что делать? это баг или фича?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
IgorKossak
сообщение Jul 28 2010, 09:00
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



QUOTE
... Eclipse такой записи не понимает и не подсказывает при вводе имена этих объединенных полей ...

Helios понимает и всё прекрасно показывает.
Попробуйте покопаться в Preferences->C/C++->Editor->Content Assist->Advanced
Go to the top of the page
 
+Quote Post
ARV
сообщение Jul 28 2010, 10:58
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 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 - в чем дело, не пойму... все прочие варианты отрабатывают...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ARV   безымянные struct и union   Jul 28 2010, 07:31
- - MrYuran   Цитата(ARV @ Jul 28 2010, 11:31) все хоро...   Jul 28 2010, 07:44
- - dimka76   а если попробовать проинитить так КодPROGMEM flex...   Jul 28 2010, 07:49
|- - ARV   Цитата(dimka76 @ Jul 28 2010, 11:49) а ес...   Jul 28 2010, 07:57
|- - dimka76   Цитата(ARV @ Jul 28 2010, 11:57) Цитата(d...   Jul 28 2010, 08:00
- - ARV   если инициализировать переменную - ошибка все равн...   Jul 28 2010, 07:50
- - MrYuran   А если так: КодPROGMEM flex_struct_t fixed = {.fix...   Jul 28 2010, 07:54
- - MrYuran   что-то у вас странное... Цитата#define var_item(t,...   Jul 28 2010, 11:46
|- - ARV   Цитата(MrYuran @ Jul 28 2010, 15:46) что-...   Jul 28 2010, 12:02
- - MrYuran   Что-то вы перемудрили... Как можно инициализироват...   Jul 28 2010, 12:12
- - ARV   почему все? я инициализирую только в одном вариант...   Jul 28 2010, 12:17
- - ARV   Жаль, что все знатоки Си, которых тут немало, не ж...   Jul 29 2010, 09:35
|- - ReAl   Цитата(ARV @ Jul 29 2010, 12:35) Жаль, чт...   Jul 29 2010, 11:32
- - dimka76   Кодunion{ uint8_t id; int *num; }; Вы...   Jul 29 2010, 10:30
|- - ARV   Цитата(dimka76 @ Jul 29 2010, 14:30) Кодu...   Jul 29 2010, 10:42
- - ARV   до этого предположения я как бы дошел, но у меня з...   Jul 29 2010, 11:48
|- - ReAl   Цитата(ARV @ Jul 29 2010, 14:48) я ведь и...   Jul 29 2010, 12:29
|- - ReAl   Цитата(ReAl @ Jul 29 2010, 15:29) Но в да...   Jul 30 2010, 09:51
- - neiver   А это стандарт такой в Си, что можно инициализиров...   Jul 29 2010, 12:09
- - ARV   что-то не выходит каменный цветок и с -fms-extensi...   Jul 30 2010, 04:20
- - ARV   на avrfreaks в очередной раз посоветовали написать...   Jul 30 2010, 10:58
- - ARV   все-таки на avrfreaks подали идею, как выкрутиться...   Jul 30 2010, 18:10
- - ReAl   Цитата(ARV @ Jul 30 2010, 21:10) все-таки...   Jul 30 2010, 18:21


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016