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

 
 
> безымянные 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
Ответов
ARV
сообщение Jul 29 2010, 09:35
Сообщение #2


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

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



Жаль, что все знатоки Си, которых тут немало, не желают подсказать, в чем я не прав, и объяснить, как следует поступить... если компилятор описание структуры считает корректным, если доступ к полям происходит - что не так с инициализацией?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 29 2010, 11:32
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(ARV @ Jul 29 2010, 12:35) *
Жаль, что все знатоки Си, которых тут немало, не желают подсказать, в чем я не прав, и объяснить, как следует поступить... если компилятор описание структуры считает корректным, если доступ к полям происходит - что не так с инициализацией?
Ну вот сразу так "С".
Сами же сказали, что это расширение GNU, в C99 такого нет. Так что все претензии к "знатокам GCC", а "знатоков С" трогать не надо.
Кстати, чужая лень не нравится, но и самому лень было поместить в сообщении минимальный компилирующийся пример, чтобы всякие
Код
typedef struct {
    uint8_t itemcount;
    menu_item_t items[];
} menu_t;
не нужно было дописывать...

На мой взгляд, причина проста.
Пусть есть
Код
typedef union {
    char c;
    double d;
} u_t;

Её инициализировать вот так
Код
u_t foo = { 5.0 };
нельзя. Ну, можно, только результат будет эквивалентен
Код
u_t foo = { .c = (char)5.0 };

Т.е. при инициализации объединения без C99-возможности указания имён полей инициализируется всегда первое поле.
В структуре menu_item_t охватывающий union не имеет имён для полей-структур и инициализация летит в первое поле-структуру, а в этой структуре ну таки нет элемента .cnt.
Если переместить структуры в хвост объединения
Код
typedef struct {
    prog_char    *text;
    uint8_t        type;
    union{
        _tm    submenu;
        struct {
            union{
                uint8_t id;
                int        *num;
            };
            func_ptr    func;
        };
        struct {
            uint8_t        vcnt;
            uint8_t        *vid;
            prog_char    **var;
        };
    };
} menu_item_t;
то и первая структура уже не будет инициализироваться.


--------------------
Ну, я пошёл… Если что – звоните…
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
- - IgorKossak   QUOTE ... Eclipse такой записи не понимает и не по...   Jul 28 2010, 09:00
|- - ARV   Цитата(IgorKossak @ Jul 28 2010, 13:00) H...   Jul 28 2010, 10:58
- - 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
- - 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:59
Рейтинг@Mail.ru


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