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

 
 
> безымянные 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
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
MrYuran
сообщение Jul 28 2010, 07:44
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 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 =)
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jul 28 2010, 07:49
Сообщение #3


developer
****

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



а если попробовать проинитить так

Код
PROGMEM flex_struct_t fixed = {0,  123};


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
ARV
сообщение Jul 28 2010, 07:50
Сообщение #4


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

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



если инициализировать переменную - ошибка все равно есть. если просто в программе работать с полями - все нормально.

не понимаются именно инициализаторы... просто для настоящих переменных это не принципиально, т.к. всегда можно поля ручками проинициализировать, а для flash альтернатив нету...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 28 2010, 07:54
Сообщение #5


Беспросветный оптимист
******

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



А если так:
Код
PROGMEM flex_struct_t fixed = {.fix=0, {.param = 123}};


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ARV
сообщение Jul 28 2010, 07:57
Сообщение #6


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

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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jul 28 2010, 08:00
Сообщение #7


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. зато так непонятно, что к чему инициализируется - от этого и хочется уйти


а что за предупреждение ?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 28 2010, 09:00
Сообщение #8


Шаман
******

Группа: Модераторы
Сообщений: 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
Сообщение #9


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

Группа: Свой
Сообщений: 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
MrYuran
сообщение Jul 28 2010, 11:46
Сообщение #10


Беспросветный оптимист
******

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



что-то у вас странное...
Цитата
#define var_item(t,c,vi,v) {.text = t, .type = i_var,{ {.vcnt=0}} }

Слева у макроса четыре аргумента, а справа используется только один...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ARV
сообщение Jul 28 2010, 12:02
Сообщение #11


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

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



Цитата(MrYuran @ Jul 28 2010, 15:46) *
что-то у вас странное...

Слева у макроса четыре аргумента, а справа используется только один...

да не в этом же дело... это я уже всякие упрощения делал, чтобы найти причину - изначально все 4 параметра использовались...
никак не получается задать поле - вот в чем беда!


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


Беспросветный оптимист
******

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



Что-то вы перемудрили...
Как можно инициализировать все элементы юниона, если они друг на друга наложены?
Писать одно поверх другого?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ARV
сообщение Jul 28 2010, 12:17
Сообщение #13


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

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



почему все? я инициализирую только в одном варианте! внутри охватывающего юниона 2 варианта структуры - инициализирую ИЛИ первый вариант, ИЛИ второй - но не в перемешку!


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


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

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



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


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


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;
        };


Здесь у вас тоже структуры разного размера


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:03
Рейтинг@Mail.ru


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