как правильно спортировать код?
От: Hard_Club  
Дата: 16.08.10 09:07
Оценка:
Есть объединение:
   union
     {
        char charr[sizeof(double) * 4];
        struct
          {
             int def, min, max, step;
          } i;
...
    struct
      {
         const char *def;
         const char **choices; /* NULL terminated array */
      } c;
     } info;

добавлена разметка — Кодт
Re: как правильно спортировать код?
От: Hard_Club  
Дата: 16.08.10 09:10
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Есть объединение:

H_C>   union
H_C>     {
H_C>        char charr[sizeof(double) * 4];
H_C>        struct
H_C>          {
H_C>             int def, min, max, step;
H_C>          } i;
H_C>...
H_C>    struct
H_C>      {
H_C>         const char *def;
H_C>         const char **choices; /* NULL terminated array */
H_C>      } c;
H_C>     } info;

так вот, в linux C static массив данных объединений специализируется так:
{{.i = {def, min, max, step}, {.i = {def, min, max, step}}.

Как перенести этот код на Visual C (там нет поддержки этого стандарта)?
добавлена разметка — Кодт
Re[2]: как правильно спортировать код?
От: Кодт Россия  
Дата: 16.08.10 09:28
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>так вот, в linux C static массив данных объединений специализируется так:

H_C>
H_C>{{.i = {def, min, max, step}, {.i = {def, min, max, step}}.
H_C>

H_C>Как перенести этот код на Visual C (там нет поддержки этого стандарта)?

Это был C99, а VC умеет только C90.
Очень просто: при агрегатной инициализации объединения — инициализируется первый член.
Поэтому, если не предполагается инициализировать строками, а только def,min,max,step, — достаточно переписать объявление структуры
union
{
  struct { int def,min,max,step } i;
  char charr[4*sizeof(int)];
}

Кстати!!! В исходном коде было [4*sizeof(double)], то есть, либо заточено под sizeof(double)==sizeof(int), либо вдвое больше.
Это опечатка или так задумано?
Перекуём баги на фичи!
Re[3]: как правильно спортировать код?
От: Hard_Club  
Дата: 16.08.10 09:51
Оценка:
К>Это был C99, а VC умеет только C90.
К>Очень просто: при агрегатной инициализации объединения — инициализируется первый член.
К>Поэтому, если не предполагается инициализировать строками, а только def,min,max,step, — достаточно переписать объявление структуры
К>
К>union
К>{
К>  struct { int def,min,max,step } i;
К>  char charr[4*sizeof(int)];
К>}
К>

К>Кстати!!! В исходном коде было [4*sizeof(double)], то есть, либо заточено под sizeof(double)==sizeof(int), либо вдвое больше.
К>Это опечатка или так задумано?

Дело в том, что объединение имеет такой вид:
   union
     {
        char charr[sizeof(double) * 4];
        struct
          {
             int def, min, max, step;
          } i;
        struct
          {
             double def, min, max, step;
          } d;
        struct
          {
             const char *def;
             const char *accept_fmt;
             const char *deny_fmt;
          } s;
        struct
          {
             int def;
             const char *false_str;
             const char *true_str;
          } b;
    struct
      {
         const char *def;
         const char **choices; /* NULL terminated array */
      } c;
     } info;


И во многих местах оно специализируется по разному с помощью этих макросов:
    #define EDJE_EXTERNAL_PARAM_INFO_INT_FULL(name, def, min, max, step) \
      {name, EDJE_EXTERNAL_PARAM_TYPE_INT, {.i = {def, min, max, step}}}
    #define EDJE_EXTERNAL_PARAM_INFO_DOUBLE_FULL(name, def, min, max, step) \
      {name, EDJE_EXTERNAL_PARAM_TYPE_DOUBLE, {.d = {def, min, max, step}}}
    #define EDJE_EXTERNAL_PARAM_INFO_STRING_FULL(name, def, accept, deny) \
      {name, EDJE_EXTERNAL_PARAM_TYPE_STRING, {.s = {def, accept, deny}}}
    #define EDJE_EXTERNAL_PARAM_INFO_BOOL_FULL(name, def, false_str, true_str) \
      {name, EDJE_EXTERNAL_PARAM_TYPE_BOOL, {.b = {def, false_str, true_str}}}
    #define EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL(name, def, choices) \
      {name, EDJE_EXTERNAL_PARAM_TYPE_CHOICE, {.c = {def, choices}}}

разметка!!! — Кодт
Re[3]: как правильно спортировать код?
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 09.09.10 06:28
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Hard_Club, Вы писали:
H_C>>так вот, в linux C static массив данных объединений специализируется так:
H_C>>
H_C>>{{.i = {def, min, max, step}, {.i = {def, min, max, step}}.
H_C>>

H_C>>Как перенести этот код на Visual C (там нет поддержки этого стандарта)?
К>Это был C99, а VC умеет только C90.
К>Очень просто: при агрегатной инициализации объединения — инициализируется первый член.
К>Поэтому, если не предполагается инициализировать строками, а только def,min,max,step, — достаточно переписать объявление структуры

Агрегатную инициализацию понимает Intel C++ compiler, который хорошо интегрируется в студию.
Только надо выставить галку C99.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.