Re: а кто C хорошо знает?

2012-10-09 Пенетрантность Artem Chuprina
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 хорошо знает?

2012-10-09 Пенетрантность Artem Chuprina
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 хорошо знает?

2012-10-09 Пенетрантность Oleksandr Gavenko
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 хорошо знает?

2012-10-09 Пенетрантность yuri . nefedov

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 хорошо знает?

2012-10-09 Пенетрантность Oleksandr Gavenko
On 2012-10-08, Dmitrii Kashin wrote:

 Eugene Berdnikov b...@protva.ru 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 хорошо знает?

2012-10-09 Пенетрантность Oleksandr Gavenko
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



Re: а кто C хорошо знает?

2012-10-08 Пенетрантность Dmitry Nezhevenko
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 хорошо знает?

2012-10-08 Пенетрантность Victor Wagner
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 хорошо знает?

2012-10-08 Пенетрантность alexander
В Mon, 8 Oct 2012 12:41:05 +0400
Dmitry E. Oboukhov un...@debian.org пишет:

 имеется некая структурка
 
 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 хорошо знает?

2012-10-08 Пенетрантность Dmitrii Kashin
Victor Wagner vi...@wagner.pp.ru 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 stdio.h
 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; iobject.body.count; i++)
25  {
26object.body.str[i] = c - i;
27  }
28  
29for (int i=0; iobject.body.count; i++)
30  {
31printf(object.body.str[%d] = %d\n,i,object.body.str[i]);
32  }
33
34printf(sizeof(struct base) = %d\n,(int)sizeof(struct base));
35printf(sizeof(int) = %d\n,(int)sizeof(int));
36  
37return 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
%
--- 

Замечу, что в книге Кернигана и Ритчи Язык программирования Си
подобных фишек не описывалось. Виктор, Вы не подскажете, где можно
почитать о подобных трюках?

-- 
**
*  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 хорошо знает?

2012-10-08 Пенетрантность yuri . nefedov

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 stdio.h
#include stdlib.h

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 хорошо знает?

2012-10-08 Пенетрантность yuri . nefedov

On Mon, 8 Oct 2012, alexander wrote:


полиморфизм братюня)) полиморфизм.. лучше использовать class{:}} хех)


 Полиморфизм на стадии компиляции?
 Или до конца письмо не дочитали?

 Ю.

Re: а кто C хорошо знает?

2012-10-08 Пенетрантность alexander
С канечя это оченъ гут) но Сашога не понимает, при чем тут 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 хорошо знает?

2012-10-08 Пенетрантность alexander
В 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 хорошо знает?

2012-10-08 Пенетрантность 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гугл по девелоперские рассылки, пока
 здесь молодёжь дебиан мусолит? :)
-- 
 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 хорошо знает?

2012-10-08 Пенетрантность alexander
В Mon, 8 Oct 2012 16:00:13 +0400
Eugene Berdnikov b...@protva.ru пишет:

 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 хорошо знает?

2012-10-08 Пенетрантность Dmitrii Kashin
Eugene Berdnikov b...@protva.ru 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 хорошо знает?

2012-10-08 Пенетрантность alexander
В Mon, 08 Oct 2012 16:38:59 +0400
Dmitrii Kashin free...@gmail.com пишет:

 Eugene Berdnikov b...@protva.ru 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 хорошо знает?

2012-10-08 Пенетрантность Victor Wagner
On 2012.10.08 at 15:33:45 +0400, Dmitrii Kashin wrote:

 Victor Wagner vi...@wagner.pp.ru 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 хорошо знает?

2012-10-08 Пенетрантность yuri . nefedov

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 хорошо знает?

2012-10-08 Пенетрантность Eugene Berdnikov
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 хорошо знает?

2012-10-08 Пенетрантность Dmitry E. Oboukhov
 Э.. Насколько я знаю С, уже тут нехорошая вещь.
 То чем вы пользуетесь есть расширение 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 хорошо знает?

2012-10-08 Пенетрантность Dmitry E. Oboukhov

 Вообще говоря вопрос к Диме Обухову: какая цель
 в возможности задать размер массива во время компиляции?
 Меньше цпу? Сомнительно. Без профайлера не поверю.
 Экономия памяти? Ну совсем копейки.
 На большее фантазии у меня не хватает.

вообще это объекты которые правда аллоцируются динамически.
но появился один случай когда надо предопределенный объект иметь, а
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 хорошо знает?

2012-10-08 Пенетрантность Andrey Rahmatullin
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 хорошо знает?

2012-10-08 Пенетрантность Dmitry E. Oboukhov
 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 хорошо знает?

2012-10-08 Пенетрантность Dmitry E. Oboukhov
 а вот если появилась необходимость саллоцировать такой объект
 статически, как быть?
 
 Завести  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 хорошо знает?

2012-10-08 Пенетрантность yuri . nefedov

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 хорошо знает?

2012-10-08 Пенетрантность Dmitrii Kashin
Victor Wagner vi...@wagner.pp.ru 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 хорошо знает?

2012-10-08 Пенетрантность Ivan Shmakov
 alexander  toyman...@gmail.com writes:
 Dmitrii Kashin free...@gmail.com пишет:

[…]

  Вообще говоря, я согласен, что это не место для подобных дискуссий,
  но Вы вот можете мне подсказать адреса рассылок, в которых, как
  здесь, можно с грамотными людьми обсудить подобные вопросы?

  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 хорошо знает?

2012-10-08 Пенетрантность Victor Wagner
On 2012.10.08 at 19:55:59 +0400, Dmitrii Kashin wrote:

 Victor Wagner vi...@wagner.pp.ru 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 хорошо знает?

2012-10-08 Пенетрантность Артём Н.
08.10.2012 15:33, Dmitrii Kashin пишет:
 --- trick.c ---
  1
  2#include stdio.h
  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; iobject.body.count; i++)
 25{
 26  object.body.str[i] = c - i;
 27}
 28
 29  for (int i=0; iobject.body.count; 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 хорошо знает?

2012-10-08 Пенетрантность yuri . nefedov

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 только как с указателем.
 Все равно такую структуру можно передавать в функцию
 только как указатель. Проверено, копируется неверно.

 Ю.