Re: структуры в C/gcc
мы микроконтроллеры программируем. поскольку там на борту всего 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
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
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/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
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
Немного устаревшие сведения :). Я сам так думал, но вот 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
Немного устаревшие сведения :). Я сам так думал, но вот 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
тут наверно есть народ который 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
Может быть поможет цитата из 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
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
Может быть поможет цитата из 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
Забыл добавить, что это расширение над ansi-C. См. например: http://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html#Unnamed-Fields В стандартном си неименованными могут быть только поля в bit field, ну и всякая экзотика типа неименованный массив на который хранится указатель: int* p = (int []) {1,2,3,4,5}; Ю.