Re: структуры в C/gcc

2011-05-30 Пенетрантность Александр Седов
 мы микроконтроллеры программируем. поскольку там на борту всего 0.5-1К
 RAM то эта RAM экономится жестко. соответственно всякие поля зачастую
 упаковываются в байты:

 struct something {
    uint8_t type;
    union {
        struct {
            unsigned flag1:1;
            unsigned field1:5;
            unsigned field2:2;
        };

        struct {
            unsigned bla:2;
            int      ble:3;
            int      bee:3;
        };
    };
 }

Офигеть. Анонимное объединение анонимных структур.
Так не покатит?
struct this_frigging_t whatthefsck = {FIRST_TYPE, { {.flag1 = 0,
.flag2 = 31, .flag3 = 2}}}


Re: структуры в C/gcc

2011-05-30 Пенетрантность Александр Седов
28 мая 2011 г. 20:34 пользователь  yuri.nefe...@gmail.com написал:
 On Sat, 28 May 2011, Dmitry E. Oboukhov wrote:


 мы микроконтроллеры программируем. поскольку там на борту всего 0.5-1К
 RAM то эта RAM экономится жестко. соответственно всякие поля зачастую
 упаковываются в байты:

 struct something {
   uint8_t type;
   union {
        struct {
           unsigned flag1:1;
           unsigned field1:5;
           unsigned field2:2;
       };

       struct {
           unsigned bla:2;
           int      ble:3;
           int      bee:3;
       };
   };
 }

 в зависимости от типа type либо одна часть либо другая часть union
 актуальна. ну и можно сюда добавить uint8_t data и проинициализировать
 union скажем числом 0x23, но это будет довольно
 * нечитабельно
 * болезненно переживать смену порядка/набора полей в union
 --

  Немного не в тему. Так, информация для размышления.
  Недавно для себя выяснил, что битовые поля могут подложить каку:
  1) Медленно работают. Переход на маски дал увеличение
     скорости в два раза.
  2) С некоторыми типами памяти gcc может дать
     неправильно работающий код:
     http://www.coranac.com/documents/working-with-bits-and-bitfields/
     (сам не проверял).
  Ну и да, процессор- компайлер- зависимо.
  Но тут видимо вообще никак.

  Ю.


Re: структуры в C/gcc

2011-05-28 Пенетрантность yuri . nefedov

On Sat, 28 May 2011, Dmitry E. Oboukhov wrote:



мы микроконтроллеры программируем. поскольку там на борту всего 0.5-1К
RAM то эта RAM экономится жестко. соответственно всякие поля зачастую
упаковываются в байты:

struct something {
   uint8_t type;
   union {
struct {
   unsigned flag1:1;
   unsigned field1:5;
   unsigned field2:2;
   };

   struct {
   unsigned bla:2;
   int  ble:3;
   int  bee:3;
   };
   };
}

в зависимости от типа type либо одна часть либо другая часть union
актуальна. ну и можно сюда добавить uint8_t data и проинициализировать
union скажем числом 0x23, но это будет довольно
* нечитабельно
* болезненно переживать смену порядка/набора полей в union
--


  Немного не в тему. Так, информация для размышления.
  Недавно для себя выяснил, что битовые поля могут подложить каку:
  1) Медленно работают. Переход на маски дал увеличение
 скорости в два раза.
  2) С некоторыми типами памяти gcc может дать
 неправильно работающий код:
 http://www.coranac.com/documents/working-with-bits-and-bitfields/
 (сам не проверял).
  Ну и да, процессор- компайлер- зависимо.
  Но тут видимо вообще никак.

 Ю.

Re: структуры в C/gcc

2011-05-27 Пенетрантность Александр Седов
2011/5/25 Dmitry E. Oboukhov un...@debian.org:
 тут наверно есть народ который C хорошо знает. такой вопрос.

 допустим имеется структура

 struct something {
    int a;
    int b;
 };

 проинициализировать можно при объявлении так:

 struct something a = { .a = 1, .b = 2 }, c = { 2, 3 };

 а вот если структура содержит неименованную структуру/union:

 struct something {
    union {
        unsigned a;
        struct {
            unsigned char b;
            unsigned char c;

        };
    };

    int x;
    int y;
 };
В union можно инициализировать только первое поле, по спецификации.
Прошу учесть.
Так что так:
something x = {{a_val}, x_val, y_val};


Re: структуры в C/gcc

2011-05-27 Пенетрантность yuri . nefedov

On Fri, 27 May 2011, Александр Седов wrote:


2011/5/25 Dmitry E. Oboukhov un...@debian.org:

тут наверно есть народ который C хорошо знает. такой вопрос.

допустим имеется структура

struct something {
   int a;
   int b;
};

проинициализировать можно при объявлении так:

struct something a = { .a = 1, .b = 2 }, c = { 2, 3 };

а вот если структура содержит неименованную структуру/union:

struct something {
   union {
       unsigned a;
       struct {
           unsigned char b;
           unsigned char c;

       };
   };

   int x;
   int y;
};

В union можно инициализировать только первое поле, по спецификации.
Прошу учесть.
Так что так:
something x = {{a_val}, x_val, y_val};


 Немного устаревшие сведения :). Я сам так думал, но вот
 ISO/IEC 9899 (http://www.open-std.org/jtc1/sc22/wg14/)
 утверждает следующее:

 6.7.8 Initialization
 
38 EXAMPLE 13 Any member of a union can be initialized:
union { /* ... */ } u = { .any_member = 42 };


 Так что в С99 можно union инициализовать через любое поле
 по стандарту.

 Ю.

Re: структуры в C/gcc

2011-05-27 Пенетрантность Александр Седов
  Немного устаревшие сведения :). Я сам так думал, но вот
  ISO/IEC 9899 (http://www.open-std.org/jtc1/sc22/wg14/)
  утверждает следующее:

  6.7.8 Initialization
  
 38 EXAMPLE 13 Any member of a union can be initialized:
        union { /* ... */ } u = { .any_member = 42 };


  Так что в С99 можно union инициализовать через любое поле
  по стандарту.
Оок, мои знания о Си дарованы Керниганом-Ритчи. Ну тогда вообще в чём
проблема? Структуру с анонимными struct/union инициализируем не по
полям, а линейно, это работает.


Re: структуры в C/gcc

2011-05-27 Пенетрантность Dmitry E. Oboukhov
  Немного устаревшие сведения :). Я сам так думал, но вот
  ISO/IEC 9899 (http://www.open-std.org/jtc1/sc22/wg14/)
  утверждает следующее:
 
  6.7.8 Initialization
  
 38 EXAMPLE 13 Any member of a union can be initialized:
        union { /* ... */ } u = { .any_member = 42 };
 
 
  Так что в С99 можно union инициализовать через любое поле
  по стандарту.

именованный union можно. а неименованный похоже никак :)

 Оок, мои знания о Си дарованы Керниганом-Ритчи. Ну тогда вообще в чём
 проблема? Структуру с анонимными struct/union инициализируем не по
 полям, а линейно, это работает.

работает, но очень некрасиво.

мы микроконтроллеры программируем. поскольку там на борту всего 0.5-1К
RAM то эта RAM экономится жестко. соответственно всякие поля зачастую
упаковываются в байты:

struct something {
uint8_t type;
union {
struct {
unsigned flag1:1;
unsigned field1:5;
unsigned field2:2;
};

struct {
unsigned bla:2;
int  ble:3;
int  bee:3;
};
};
}

в зависимости от типа type либо одна часть либо другая часть union
актуальна. ну и можно сюда добавить uint8_t data и проинициализировать
union скажем числом 0x23, но это будет довольно
 * нечитабельно
 * болезненно переживать смену порядка/набора полей в union
-- 

. ''`.   Dmitry E. Oboukhov
: :’  :   email: un...@debian.org jabber://un...@uvw.ru
`. `~’  GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537


signature.asc
Description: Digital signature


структуры в C/gcc

2011-05-25 Пенетрантность Dmitry E. Oboukhov
тут наверно есть народ который C хорошо знает. такой вопрос.

допустим имеется структура

struct something {
int a;
int b;
};

проинициализировать можно при объявлении так:

struct something a = { .a = 1, .b = 2 }, c = { 2, 3 };

а вот если структура содержит неименованную структуру/union:

struct something {
union {
unsigned a;
struct {
unsigned char b;
unsigned char c;

};
};

int x;
int y;
};

то как зная поля x, y, a или x, y, b, c проинициализировать структуру
при объявлении?

если union и вложенный struct делать именованными, то тут все понятно,
но этого делать не хочется
-- 

. ''`.   Dmitry E. Oboukhov
: :’  :   email: un...@debian.org jabber://un...@uvw.ru
`. `~’  GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537


signature.asc
Description: Digital signature


Re: структуры в C/gcc

2011-05-25 Пенетрантность Konstantin Matyukhin
Может быть поможет цитата из C1X Draft:
Unnamed members of objects of structure and union type do not
participate in initialization.
Unnamed members of structure objects have indeterminate value even
after initialization.

-- 
С уважением,
Константин Матюхин


Re: структуры в C/gcc

2011-05-25 Пенетрантность yuri . nefedov

On Wed, 25 May 2011, Dmitry E. Oboukhov wrote:


тут наверно есть народ который C хорошо знает. такой вопрос.

допустим имеется структура

struct something {
   int a;
   int b;
};

проинициализировать можно при объявлении так:

struct something a = { .a = 1, .b = 2 }, c = { 2, 3 };

а вот если структура содержит неименованную структуру/union:

struct something {
   union {
unsigned a;
struct {
unsigned char b;
unsigned char c;

   };
   };

   int x;
   int y;
};

то как зная поля x, y, a или x, y, b, c проинициализировать структуру
при объявлении?

если union и вложенный struct делать именованными, то тут все понятно,
но этого делать не хочется
--


 Например так:

struct something2 {
union {
struct {
unsigned char b;
unsigned char c;

};
unsigned a;
};

int x;
int y;
};

  struct something2 A2 = { {{.b = 'a'}}, .y=10, .x = 5 };
  printf( %d %d %d\n,A2.x,A2.y,A2.a);

  struct something2 A3 = { {.a = 98}, .y=10, .x = 5 };
  printf( %d %d %c\n,A3.x,A3.y,A3.b);

 5 10 97
 5 10 b

 Но лучше так не делать!

 Ю.

Re: структуры в C/gcc

2011-05-25 Пенетрантность Dmitry E. Oboukhov
 Может быть поможет цитата из C1X Draft:
 Unnamed members of objects of structure and union type do not
 participate in initialization.
 Unnamed members of structure objects have indeterminate value even
 after initialization.

не то чтобы она помогла, но ясность внесла, спасибо!
-- 

. ''`.   Dmitry E. Oboukhov
: :’  :   email: un...@debian.org jabber://un...@uvw.ru
`. `~’  GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537


signature.asc
Description: Digital signature


Re: структуры в C/gcc

2011-05-25 Пенетрантность yuri . nefedov


 Забыл добавить, что это расширение над ansi-C.
 См. например:
 http://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html#Unnamed-Fields

 В стандартном си неименованными могут быть только поля в bit field,
 ну и всякая экзотика типа неименованный массив на который хранится
 указатель:

 int* p = (int []) {1,2,3,4,5};

 Ю.