а кто C хорошо знает?
имеется некая структурка struct something { ... unsigned count; unsigned element[0]; }; то есть в поле count сказано сколько элементов будет после структурки. ну и обращение к ним идет так: for (i = 0; i < s->count; i++) { s->elements[i] = i; } теперь когда мы это хотим саллоцировать, то пишем такой аллокатор struct something * some_alloc(unsigned size) { return malloc(sizeof(struct something) + sizeof(unsigned) * size); } а вот если появилась необходимость саллоцировать такой объект статически, как быть? хочется макрос #define SOMETHING(name, size) ... чтобы пользователь мог сказать void foo(void) { static SOMETHING(name, 5); SOMETHING(name2, 10); } и получить саллоцированный на стадии компиляции (или в стеке) такой объект? -- . ''`. 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 хорошо знает?
On Mon, Oct 08, 2012 at 12:41:05PM +0400, Dmitry E. Oboukhov wrote: > хочется макрос > > #define SOMETHING(name, size) ... > > чтобы пользователь мог сказать > > void foo(void) { > static SOMETHING(name, 5); > SOMETHING(name2, 10); > } > > и получить саллоцированный на стадии компиляции (или в стеке) такой объект? Взять C++. На C можно покостылять вроде создания вместо структуры массива какого-то и дальше кастовать. Чтоб вышло что-то типа такого: static char struct_data_container[sizeof(your_struct)+...]; your_struct *struct_ptr = (your_struct*)struct_data_container; Или еще какой подобный ужас :) -- WBR, Dmitry signature.asc Description: Digital signature
Re: а кто C хорошо знает?
On 2012.10.08 at 12:41:05 +0400, Dmitry E. Oboukhov wrote: > имеется некая структурка > > struct something { > ... > > unsigned count; > unsigned element[0]; > }; > > то есть в поле count сказано сколько элементов будет после структурки. > ну и обращение к ним идет так: > > for (i = 0; i < s->count; i++) { > s->elements[i] = i; > } > > > теперь когда мы это хотим саллоцировать, то пишем такой аллокатор > > struct something * some_alloc(unsigned size) { > return malloc(sizeof(struct something) + sizeof(unsigned) * size); > } > > > а вот если появилась необходимость саллоцировать такой объект > статически, как быть? Завести union. С первым вариантом struct something и вторым - массивом требуемой длины. (учитывая sizeof(struct something). -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20121008101509.ga1...@wagner.pp.ru
Re: а кто C хорошо знает?
В Mon, 8 Oct 2012 12:41:05 +0400 "Dmitry E. Oboukhov" пишет: > имеется некая структурка > > struct something { > ... > > unsigned count; > unsigned element[0]; > }; > > то есть в поле count сказано сколько элементов будет после структурки. > ну и обращение к ним идет так: > > for (i = 0; i < s->count; i++) { > s->elements[i] = i; > } > > > теперь когда мы это хотим саллоцировать, то пишем такой аллокатор > > struct something * some_alloc(unsigned size) { > return malloc(sizeof(struct something) + sizeof(unsigned) * size); > } > > > а вот если появилась необходимость саллоцировать такой объект > статически, как быть? полиморфизм братюня)) полиморфизм.. лучше использовать class{:}} хех) > > хочется макрос > > #define SOMETHING(name, size) ... чот не дошло, а при чем тутя структура something O_o > > чтобы пользователь мог сказать > > void foo(void) { > static SOMETHING(name, 5); > SOMETHING(name2, 10); > } чото помница Сашога определял константы вне процедуры словом global %)) хех) > > и получить саллоцированный на стадии компиляции (или в стеке) такой > объект? > > void foo(void) { asm('PUSH *something'); #не? } -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20121008221509.39f32...@omen.dyndns-ip.com
Re: а кто C хорошо знает?
Victor Wagner writes: > On 2012.10.08 at 12:41:05 +0400, Dmitry E. Oboukhov wrote: > >> а вот если появилась необходимость саллоцировать такой объект >> статически, как быть? > > Завести union. С первым вариантом struct something и вторым - массивом > требуемой длины. (учитывая sizeof(struct something). Элегантность этого решения настолько впечатлила меня, что я даже озаботился написанием примера. Вот он: --- trick.c --- 1 2 #include 3 4 struct base 5 { 6int count; 7int str[0]; 8 }; 9 10 int main(int argc, char** argv) 11 { 12int c; 13printf("Input length> "); 14scanf("%d",&c); 15 16union 17{ 18 struct base body; 19 int str[sizeof(struct base)+c]; 20} object; 21 22object.body.count = c; 23 24for (int i=0; i 3 object.body.str[0] = 3 object.body.str[1] = 2 object.body.str[2] = 1 sizeof(struct base) = 4 sizeof(int) = 4 % --- Замечу, что в книге Кернигана и Ритчи "Язык программирования Си" подобных фишек не описывалось. Виктор, Вы не подскажете, где можно почитать о подобных трюках? -- ** * jabber: free...@jabber.mipt.ru * * Registered linux user #546240* ** -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87r4p9nqp2@ws00.freehck.ru
Re: а кто C хорошо знает?
On Mon, 8 Oct 2012, Dmitry E. Oboukhov wrote: имеется некая структурка struct something { ... unsigned count; unsigned element[0]; }; то есть в поле count сказано сколько элементов будет после структурки. ну и обращение к ним идет так: for (i = 0; i < s->count; i++) { s->elements[i] = i; } теперь когда мы это хотим саллоцировать, то пишем такой аллокатор struct something * some_alloc(unsigned size) { return malloc(sizeof(struct something) + sizeof(unsigned) * size); } Э.. Насколько я знаю С, уже тут нехорошая вещь. То чем вы пользуетесь есть расширение gcc http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html и как всякое расширение лучше им без необходимости не пользоваться. В С89 обычная практика использовать: unsigned element[1]; и затем struct something * some_alloc(unsigned size) { return malloc(sizeof(struct something) + sizeof(unsigned) * (size-1)); } Это наиболее переносимый вариант. Можно использовать flexible arays из С99 unsigned element[]; (без нуля !) gcc (>3 версии) отлично их кушает. а вот если появилась необходимость саллоцировать такой объект статически, как быть? хочется макрос #define SOMETHING(name, size) ... чтобы пользователь мог сказать void foo(void) { static SOMETHING(name, 5); SOMETHING(name2, 10); } и получить саллоцированный на стадии компиляции (или в стеке) такой объект? Вообще говоря нельзя. Собственно говоря flexible arrays придуманы именно для удобства алокации памяти в run time. Как это можно сделать в С++ я тоже не понимаю. Трюк, который предложил Виктор Вагнер, работает, но кое где синтаксис прийдется править. Вот программка для тестирования -- кусь кусь - #include #include struct something { unsigned count; unsigned element[]; }; #define SOMETHING(NAME, SIZE) \ union{ \ struct something NAME; \ struct { unsigned count; unsigned element[SIZE]; }; \ } NAME; #define SOMETH_DIN(name, size) struct something* name=some_alloc(size); \ name->count=(size); struct something* some_alloc(unsigned size) { return malloc(sizeof(struct something) + sizeof(unsigned) * size); } void print_something(struct something* s) { printf(" something -> count= %u\n", s->count); int i; for(i = 0; i < s->count; i++) { printf(" -> [%i] = %u\n",i,s->element[i]); } } int main() { struct something *s = some_alloc(10); s->count=3; int i; for(i = 0; i < s->count; i++) { s->element[i] = i; } print_something(s); SOMETH_DIN(p,5); for(i = 0; i < p->count; i++) { p->element[i] = 10+i; } print_something(p); SOMETHING(P,5); P.count=4; for(i = 0; i < P.count; i++) { P.element[i] = 20+i; } print_something(&P.P); return 0; } -- кусь кусь - Ho! 1) неименованные структуры - это опять же расширение над ansiC. Если же именовать, то прийдется писать везде P.P 2) в вызове функции все равно прийдется писать P.P p.s. Что такое "саллоцировать" я даже в гугле поискал )) Велик и могучь р.я.
Re: а кто C хорошо знает?
On Mon, 8 Oct 2012, alexander wrote: полиморфизм братюня)) полиморфизм.. лучше использовать class{:}} хех) Полиморфизм на стадии компиляции? Или до конца письмо не дочитали? Ю.
Re: а кто C хорошо знает?
С канечя это оченъ гут) но Сашога не понимает, при чем тут debian? O_o nospam! -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20121008224843.29245...@omen.dyndns-ip.com
Re: а кто C хорошо знает?
В Mon, 8 Oct 2012 15:46:18 +0400 (MSK) yuri.nefe...@gmail.com пишет: > On Mon, 8 Oct 2012, alexander wrote: > > > полиморфизм братюня)) полиморфизм.. лучше использовать class{:}} > > хех) > > Полиморфизм на стадии компиляции? > Или до конца письмо не дочитали? > > Ю. да Сашога воще не понимает зачем этот глобальная статическая структура нужна) неужто эксплойт разрабатываетъ?))) -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20121008225117.3d05a...@omen.dyndns-ip.com
Re: а кто C хорошо знает?
On Mon, Oct 08, 2012 at 03:42:40PM +0400, yuri.nefe...@gmail.com wrote: > Ho! > 1) неименованные структуры - это опять же расширение >над ansiC. Если же именовать, то прийдется писать везде P.P > 2) в вызове функции все равно прийдется писать P.P Эта проблема легко и просто решается препроцессором: #define myobj topname.obname myobj.count = 1; myobj.data[0] = 11; ... Трюк описан в разных файликах под /usr/include/. Наверное, в книжках тоже. P.S. Аксакалы, может вам лучше 2гугл по девелоперские рассылки, пока здесь молодёжь дебиан мусолит? :) -- Eugene Berdnikov -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20121008120013.gp24...@protva.ru
Re: а кто C хорошо знает?
В Mon, 8 Oct 2012 16:00:13 +0400 Eugene Berdnikov пишет: > On Mon, Oct 08, 2012 at 03:42:40PM +0400, yuri.nefe...@gmail.com > wrote: > > Ho! > > 1) неименованные структуры - это опять же расширение > >над ansiC. Если же именовать, то прийдется писать везде P.P > > 2) в вызове функции все равно прийдется писать P.P > > Эта проблема легко и просто решается препроцессором: > >#define myobj topname.obname >myobj.count = 1; >myobj.data[0] = 11; >... > > Трюк описан в разных файликах под /usr/include/. Наверное, в книжках > тоже. > > P.S. Аксакалы, может вам лучше 2гугл по девелоперские рассылки, пока > здесь молодёжь дебиан мусолит? :) Оh my god!!)) Мусоление дебиана - весчь бесконечная!)) А точнее бесконечны баги SLow Poke'a дебьяна!!!)) Amen. -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20121008230530.1a923...@omen.dyndns-ip.com
Re: а кто C хорошо знает?
Eugene Berdnikov writes: > P.S. Аксакалы, может вам лучше 2гугл по девелоперские рассылки, пока > здесь молодёжь дебиан мусолит? :) Ну почему же. Я вот внимательно слежу за этим тредом и все читаю. Мне очень интересно. Вообще говоря, я согласен, что это не место для подобных дискуссий, но Вы вот можете мне подсказать адреса рассылок, в которых, как здесь, можно с грамотными людьми обсудить подобные вопросы? -- ** * jabber: free...@jabber.mipt.ru * * Registered linux user #546240* ** -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87mwzxnnoc@ws00.freehck.ru
Re: а кто C хорошо знает?
В Mon, 08 Oct 2012 16:38:59 +0400 Dmitrii Kashin пишет: > Eugene Berdnikov writes: > > > P.S. Аксакалы, может вам лучше 2гугл по девелоперские рассылки, > > пока здесь молодёжь дебиан мусолит? :) > > Ну почему же. Я вот внимательно слежу за этим тредом и все читаю. Мне > очень интересно. > > Вообще говоря, я согласен, что это не место для подобных дискуссий, но > Вы вот можете мне подсказать адреса рассылок, в которых, как здесь, > можно с грамотными людьми обсудить подобные вопросы? > http://lmgtfy.com/?q=%D1%84%D0%BE%D1%80%D1%83%D0%BC+%D0%BF%D0%BE+%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8E+%D0%BD%D0%B0+%D0%A1%D0%B8 -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20121008235117.511ae...@omen.dyndns-ip.com
Re: а кто C хорошо знает?
On 2012.10.08 at 15:33:45 +0400, Dmitrii Kashin wrote: > Victor Wagner writes: > > > On 2012.10.08 at 12:41:05 +0400, Dmitry E. Oboukhov wrote: > > > >> а вот если появилась необходимость саллоцировать такой объект > >> статически, как быть? > > > > Завести union. С первым вариантом struct something и вторым - массивом > > требуемой длины. (учитывая sizeof(struct something). > > Элегантность этого решения настолько впечатлила меня, что я даже > озаботился написанием примера. Вот он: Кстати, тут пришло в голову еще одно решение - использовать alloca. Это не совсем статическая структура, а явное выделение памяти в стеке. Но тем не менее. > > Замечу, что в книге Кернигана и Ритчи "Язык программирования Си" > подобных фишек не описывалось. Виктор, Вы не подскажете, где можно > почитать о подобных трюках? Есть очень хорошая книга Питера ван дер Линдена "Expert C programming". Там, насколько я помню, было очень доходчиво написано, какими граблями чревато использование подобных трюков. -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20121008133640.ga5...@wagner.pp.ru
Re: а кто C хорошо знает?
On Mon, 8 Oct 2012, Eugene Berdnikov wrote: On Mon, Oct 08, 2012 at 03:42:40PM +0400, yuri.nefe...@gmail.com wrote: Ho! 1) неименованные структуры - это опять же расширение над ansiC. Если же именовать, то прийдется писать везде P.P 2) в вызове функции все равно прийдется писать P.P Эта проблема легко и просто решается препроцессором: #define myobj topname.obname myobj.count = 1; myobj.data[0] = 11; ... Трюк описан в разных файликах под /usr/include/. Наверное, в книжках тоже. Решить то можно, а осадочек то останется... 1) Про массивы переменных надо забыть. 2) При таком подходе union вообще говоря не нужен, можно написать что-то типа: #define SOMETH_STAT(NAME, SIZE) \ struct { unsigned count; unsigned element[SIZE]; }_NAME; \ _NAME.count=(SIZE); \ struct something *NAME = (struct something *) &_NAME; ... SOMETH_STAT(t,6); for(i = 0; i < t->count; i++) { t->element[i] = 30+i; } print_something(t); И в этом подходе уже абсолютно очевидно, что на каждую переменную создается по своей структуре, так что компилятору придется потрудится. Возможно оптимизация кода ухудшится. Вообще говоря вопрос к Диме Обухову: какая цель в возможности задать размер массива во время компиляции? Меньше цпу? Сомнительно. Без профайлера не поверю. Экономия памяти? Ну совсем копейки. На большее фантазии у меня не хватает. P.S. Аксакалы, может вам лучше 2гугл по девелоперские рассылки, пока здесь молодёжь дебиан мусолит? :) Вполне даже дебиан. Тонкости работы gcc. Ни чем не хуже чем тонкости функционирования ssd, или samba-4. Это же user рассылка. :-)
Re: а кто C хорошо знает?
On Mon, Oct 08, 2012 at 05:36:40PM +0400, Victor Wagner wrote: > Кстати, тут пришло в голову еще одно решение - использовать alloca. > Это не совсем статическая структура, а явное выделение памяти в стеке. > Но тем не менее. Человек просил портабельно, у alloca() с этим проблемы. -- Eugene Berdnikov -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20121008134405.gr24...@protva.ru
Re: а кто C хорошо знает?
> Э.. Насколько я знаю С, уже тут нехорошая вещь. > То чем вы пользуетесь есть расширение gcc > http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html > и как всякое расширение лучше им без необходимости не пользоваться. ну бОльшая часть линукс кернела в этом стиле написана, так что имхо пользоваться можно :) > Можно использовать flexible arays из С99 > unsigned element[]; > (без нуля !) > gcc (>3 версии) отлично их кушает. а вот на это надо будет посмотреть спасибо :) > p.s. Что такое "саллоцировать" я даже в гугле поискал )) Велик и могучь р.я. :) -- . ''`. 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 хорошо знает?
> Вообще говоря вопрос к Диме Обухову: какая цель > в возможности задать размер массива во время компиляции? > Меньше цпу? Сомнительно. Без профайлера не поверю. > Экономия памяти? Ну совсем копейки. > На большее фантазии у меня не хватает. вообще это объекты которые правда аллоцируются динамически. но появился один случай когда надо предопределенный объект иметь, а init функцию специально для него писать не хочется, вот собственно отсюда и вопрос :) -- . ''`. 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 хорошо знает?
On Mon, Oct 08, 2012 at 06:26:09PM +0400, Dmitry E. Oboukhov wrote: > > Э.. Насколько я знаю С, уже тут нехорошая вещь. > > То чем вы пользуетесь есть расширение gcc > > http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html > > и как всякое расширение лучше им без необходимости не пользоваться. > > ну бОльшая часть линукс кернела в этом стиле написана, так что имхо > пользоваться можно :) Ядро и не стремится поддерживать не-гцц :) -- WBR, wRAR signature.asc Description: Digital signature
Re: а кто C хорошо знает?
> 16 union > 17 { > 18struct base body; > 19int str[sizeof(struct base)+c]; > 20 } object; тут может быть просто struct и тогда не надо будет sizeof(struct base) вопрос как это в макрос засунть, чтобы потом функции которые хотят указатель на struct base с этим работать? #define SOMETING(__name, __size)\ struct {\ struct something s; \ unsigned items[__size]; \ } __attribute__((packed)) __name = {\ .s = { \ .size = __size, \ } \ } Делает почти все что нужно: int some_func(struct something *); static SOMETING(variable, 10); void foo(void) { ... some_func((struct something *)&variable); ... } То есть пользоваться можно, но надо приводить типы. А хорошо бы сделать так чтобы типы приводить тоже не надо было, но результат был такой же. Как вариант можно сделать прототип у функции some_func: int some_func(void *); но это даже хуже чем приведение типа при вызове имхо -- . ''`. 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 хорошо знает?
а вот если появилась необходимость саллоцировать такой объект статически, как быть? >>> >>> Завести union. С первым вариантом struct something и вторым - массивом >>> требуемой длины. (учитывая sizeof(struct something). >> >> Элегантность этого решения настолько впечатлила меня, что я даже >> озаботился написанием примера. Вот он: > Кстати, тут пришло в голову еще одно решение - использовать alloca. > Это не совсем статическая структура, а явное выделение памяти в стеке. > Но тем не менее. у меня основная задача не на стеке, а в модуле статическую переменную выделить. то есть в сегменте .data (или хотя бы .bss) см мое соседнее письмо с примером макроса -- . ''`. 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 хорошо знает?
On Mon, 8 Oct 2012, Andrey Rahmatullin wrote: On Mon, Oct 08, 2012 at 06:26:09PM +0400, Dmitry E. Oboukhov wrote: Э.. Насколько я знаю С, уже тут нехорошая вещь. То чем вы пользуетесь есть расширение gcc http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html и как всякое расширение лучше им без необходимости не пользоваться. ну бОльшая часть линукс кернела в этом стиле написана, так что имхо пользоваться можно :) Ядро и не стремится поддерживать не-гцц :) Вроде бы пробовали компилировать c clang? http://llvm.org/bugs/show_bug.cgi?id=4068 http://lwn.net/Articles/441018/ Так что не так все плохо. Ю.
Re: а кто C хорошо знает?
Victor Wagner writes: >> Замечу, что в книге Кернигана и Ритчи "Язык программирования Си" >> подобных фишек не описывалось. Виктор, Вы не подскажете, где можно >> почитать о подобных трюках? > > Есть очень хорошая книга Питера ван дер Линдена "Expert C programming". > Там, насколько я помню, было очень доходчиво написано, какими граблями > чревато использование подобных трюков. Нашел книгу и уже погрепал по слову union. К сожалению, примера, относящегося к обсуждаемому случаю я не нашел. Дело еще осложняется тем, что книга не имеет содержания, и на первый взгляд напоминает скорее эссе. Собственно, вы меня несколько напугали. Меня интересует, на какие грабли я могу нарваться, если буду писать так, как в приведенном ранее коде. Сам я не вижу потенциальных проблем использования подобных конструкций. -- ** * jabber: free...@jabber.mipt.ru * * Registered linux user #546240* ** -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/878vbhnek0@ws00.freehck.ru
Re: а кто C хорошо знает?
> alexander writes: > Dmitrii Kashin пишет: […] >> Вообще говоря, я согласен, что это не место для подобных дискуссий, >> но Вы вот можете мне подсказать адреса рассылок, в которых, как >> здесь, можно с грамотными людьми обсудить подобные вопросы? > http://lmgtfy.com/?q=%D1%84%D0%BE%D1%80%D1%83%D0%BC+%D0%BF%D0%BE+%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8E+%D0%BD%D0%B0+%D0%A1%D0%B8 У меня «сложилось впечатление», что «старожилы» не очень-то жалуют Web-форумы. Я бы предложил воспользоваться конференциями Usenet (e. g., news:relcom.comp.lang.c-c++ †), но, боюсь, чтобы в них кто-то появился, нужно сначала туда этого кого-то позвать. † nntp://aioe.org/relcom.comp.lang.c-c++ http://www.eternal-september.org/RegisterNewsAccount.php http://groups.google.com/group/relcom.comp.lang.c-c++ etc. -- FSF associate member #7257 -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/86k3v0kgmi@gray.siamics.net
Re: а кто C хорошо знает?
On 2012.10.08 at 19:55:59 +0400, Dmitrii Kashin wrote: > Victor Wagner writes: > > >> Замечу, что в книге Кернигана и Ритчи "Язык программирования Си" > >> подобных фишек не описывалось. Виктор, Вы не подскажете, где можно > >> почитать о подобных трюках? > > > > Есть очень хорошая книга Питера ван дер Линдена "Expert C programming". > > Там, насколько я помню, было очень доходчиво написано, какими граблями > > чревато использование подобных трюков. > > Нашел книгу и уже погрепал по слову union. К сожалению, примера, > относящегося к обсуждаемому случаю я не нашел. Дело еще осложняется тем, > что книга не имеет содержания, и на первый взгляд напоминает скорее > эссе. Вот именно что сборник эссе. Из серии - человек с огромным опытом вспоминает минувшие дни "и битвы, где вместе рубились они". > Собственно, вы меня несколько напугали. Меня интересует, на какие грабли > я могу нарваться, если буду писать так, как в приведенном ранее > коде. Сам я не вижу потенциальных проблем использования подобных Например, можно нарваться на выравнивание полей структуры. Вот взбредет компилятору поле-массив выравнять не по размеру элемента, а по какой-то более крупной границе, и окажется что размер второго варианта union (на который выделяется память) на пару байтов меньше, чем первый + нужное количество элементов массива. И попортим следующий элемент стэка. А там - адрес возврата из функции. -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20121008174438.ga11...@wagner.pp.ru
Re: а кто C хорошо знает?
08.10.2012 15:33, Dmitrii Kashin пишет: > --- trick.c --- > 1 > 2#include > 3 > 4struct base > 5{ > 6 int count; > 7 int str[0]; > 8}; > 9 > 10int main(int argc, char** argv) > 11{ > 12 int c; > 13 printf("Input length> "); > 14 scanf("%d",&c); > 15 > 16 union > 17 { > 18struct base body; > 19int str[sizeof(struct base)+c]; > 20 } object; > 21 > 22 object.body.count = c; > 23 > 24 for (int i=0; i 25{ > 26 object.body.str[i] = c - i; > 27} > 28 > 29 for (int i=0; i 30{ > 31 printf("object.body.str[%d] = %d\n",i,object.body.str[i]); > 32} > 33 > 34 printf("sizeof(struct base) = %d\n",(int)sizeof(struct base)); > 35 printf("sizeof(int) = %d\n",(int)sizeof(int)); > 36 > 37 return 0; > 38} > 39 > --- > > Компиляция и работа: > > --- > % c99 trick.c -o trick > % ./trick > Input length> 3 > object.body.str[0] = 3 > object.body.str[1] = 2 > object.body.str[2] = 1 > sizeof(struct base) = 4 > sizeof(int) = 4 > % > --- > > Замечу, что в книге Кернигана и Ритчи "Язык программирования Си" > подобных фишек не описывалось. Виктор, Вы не подскажете, где можно > почитать о подобных трюках? В зависимости от того, где вы хотите применять трюки: http://govnokod.ru/ http://underhanded.xcott.com/ http://ru.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest А также неплохо почитать про "принцип наименьшей неожиданности". -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/50731910.3090...@yandex.ru
Re: а кто C хорошо знает?
On Mon, 8 Oct 2012, Dmitry E. Oboukhov wrote: #define SOMETING(__name, __size)\ struct {\ struct something s; \ unsigned items[__size]; \ } __attribute__((packed)) __name = {\ .s = { \ .size = __size, \ } \ } А если так: #define SOMETING(__name, __size)\ struct { \ struct something s; \ unsigned items[__size]; \ } __attribute__((packed)) __name##_tmp = { \ .s = { \ .count = __size, \ }\ }; \ struct something* __name = &(__name##_tmp.s); Дальше работать с __name только как с указателем. Все равно такую структуру можно передавать в функцию только как указатель. Проверено, копируется неверно. Ю.
Re: а кто C хорошо знает?
Dmitry E. Oboukhov -> debian-russian@lists.debian.org @ Mon, 8 Oct 2012 12:41:05 +0400: DEO> имеется некая структурка DEO> struct something { DEO> ... DEO> unsigned count; DEO> unsigned element[0]; DEO> }; DEO> то есть в поле count сказано сколько элементов будет после структурки. DEO> ну и обращение к ним идет так: DEO> for (i = 0; i < s->count; i++) { DEO> s->elements[i] = i; DEO> } DEO> теперь когда мы это хотим саллоцировать, то пишем такой аллокатор DEO> struct something * some_alloc(unsigned size) { DEO> return malloc(sizeof(struct something) + sizeof(unsigned) * size); DEO> } DEO> а вот если появилась необходимость саллоцировать такой объект DEO> статически, как быть? DEO> хочется макрос DEO> #define SOMETHING(name, size) ... DEO> чтобы пользователь мог сказать DEO> void foo(void) { DEO> static SOMETHING(name, 5); DEO> SOMETHING(name2, 10); DEO> } DEO> и получить саллоцированный на стадии компиляции (или в стеке) такой объект? Так вот сходу не поручусь, но я бы делал что-то типа танцев вокруг union { struct something #name; char[sizeof(struct something) + sizeof(unsigned)*size]; }; Но там потанцевать вокруг имен придется, чтобы получить-таки на выходе интересующий тебя name. На ум приходит фокус с errno, который макрос, разворачивающийся во что-то типа *(per_thread_errno_ptr()). Позаниматься построением работающего решения не готов. И слово static, скорее всего, придется запихивать внутрь макроса. -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87obkdtetj@wizzle.ran.pp.ru
Re: а кто C хорошо знает?
Dmitry E. Oboukhov -> debian-russian@lists.debian.org @ Mon, 8 Oct 2012 18:26:09 +0400: >> Э.. Насколько я знаю С, уже тут нехорошая вещь. >> То чем вы пользуетесь есть расширение gcc >> http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html >> и как всякое расширение лучше им без необходимости не пользоваться. DEO> ну бОльшая часть линукс кернела в этом стиле написана, так что имхо DEO> пользоваться можно :) Линукс кернел, Дим, крайне далекая от портабельности вещь. Как и любой другой кернел... -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87391ot61b@wizzle.ran.pp.ru
Re: а кто C хорошо знает?
On 2012-10-08, Victor Wagner wrote: >> Замечу, что в книге Кернигана и Ритчи "Язык программирования Си" >> подобных фишек не описывалось. Виктор, Вы не подскажете, где можно >> почитать о подобных трюках? > > Есть очень хорошая книга Питера ван дер Линдена "Expert C programming". > Там, насколько я помню, было очень доходчиво написано, какими граблями > чревато использование подобных трюков. Читаем стандарт и http://www.knosof.co.uk/cbook/cbook.html C Language Book Material по ключевым словам: flexible array member -- Best regards! -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87vcejiwzv@gavenkoa.example.com
Re: а кто C хорошо знает?
On Tue, 9 Oct 2012, Oleksandr Gavenko wrote: On 2012-10-08, Victor Wagner wrote: Замечу, что в книге Кернигана и Ритчи "Язык программирования Си" подобных фишек не описывалось. Виктор, Вы не подскажете, где можно почитать о подобных трюках? Есть очень хорошая книга Питера ван дер Линдена "Expert C programming". Там, насколько я помню, было очень доходчиво написано, какими граблями чревато использование подобных трюков. Читаем стандарт и http://www.knosof.co.uk/cbook/cbook.html C Language Book Material по ключевым словам: flexible array member Речь шла не о flexible arrays, а о использовании structure/unit и о том, что поля в них могут хранится разрежено. По стандарту. И размер дыры между полями заранее угадать нельзя. Ю.
Re: а кто C хорошо знает?
On 2012-10-08, Dmitrii Kashin wrote: > Eugene Berdnikov writes: > >> P.S. Аксакалы, может вам лучше 2гугл по девелоперские рассылки, пока >> здесь молодёжь дебиан мусолит? :) > > Ну почему же. Я вот внимательно слежу за этим тредом и все читаю. Мне > очень интересно. > > Вообще говоря, я согласен, что это не место для подобных дискуссий, но > Вы вот можете мне подсказать адреса рассылок, в которых, как здесь, > можно с грамотными людьми обсудить подобные вопросы? > Я почитываю: gmane.comp.lang.c.general comp.lang.c comp.lang.c.moderated comp.std.c alt.comp.lang.c comp.lang.c++ comp.lang.c++.moderated alt.comp.lang.learn.c-c++ rsdn.cpp sqlru.c++ comp.unix.programmer rsdn.unix sqlru.linux Еще щас популярен: http://stackoverflow.com/ и его братья/сестры. -- Best regards! -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87r4p7iwei@gavenkoa.example.com
Re: а кто C хорошо знает?
On 2012-10-09, yuri.nefe...@gmail.com wrote: > On Tue, 9 Oct 2012, Oleksandr Gavenko wrote: > >> по ключевым словам: >> >> flexible array member >> > > Речь шла не о flexible arrays, а о использовании structure/unit > и о том, что поля в них могут хранится разрежено. По стандарту. > И размер дыры между полями заранее угадать нельзя. > Речь шла о "flexible array member". Стандарт определяет следующие возможности и ограничения для "flexible array member": 6.7.2.1 Structure and union specifiers There are a few restrictions on flexible array members that ensure that code using them makes sense. For example, there must be at least one other member, and the flexible array must occur last. Similarly, structures containing flexible arrays can't occur in other structures or in arrays. Finally, sizeof applied to the structure ignores the array but counts any padding before it. This makes the malloc call as simple as possible. -- Best regards! -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87mwzvivj8@gavenkoa.example.com