LINUX.ORG.RU

восмеричную константу в десятичную

 , , ,


0

2

Имеем приблизительно такой код

#define XXX(n) ar[n]=s._field_##n;
XXX(01);
XXX(02);
XXX(03);
XXX(04);
XXX(05);
XXX(06);
XXX(07);
XXX(08);

Естесвенно при при компиляции получаем ошибку, т.к. 08 это неправильная восмеричная константа. Обойти можно так

#define XXX(n) ar[1##n-100]=s._field_##n;
Но как-то это некрасиво. Может есть более красивый подход?

★★★

Последнее исправление: vromanov (всего исправлений: 1)

хернёй какой-то занимаетесь

anonymous
()

(в твоем макросе, кстати, точка с запятой лишная)

s._field_01
s._field_02
s._field_03
...
s._field_08

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

struct foo {
  unsigned char _fields[8];
};

Ну и XXX:

defined XXX(n) ar[n]=s._fields[n]
theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Структуры генерятся из текстового файла (dbc). Типа такого

BO_ 2566893872 IoInput3_0: 8 Device
 SG_ DigitalInput_12 : 21|2@0+ (1,0) [0|3] ""  Host
 SG_ DigitalInput_11 : 23|2@0+ (1,0) [0|3] ""  Host
 SG_ DigitalInput_10 : 5|2@0+ (1,0) [0|3] ""  Host
 SG_ DigitalInput_09 : 7|2@0+ (1,0) [0|3] ""  Host
 SG_ AnalogInput_09 : 3|12@0+ (0.01,0) [0|40.95] ""  Host
 SG_ AnalogInput_12 : 51|12@0+ (0.01,0) [0|40.95] ""  Host
 SG_ AnalogInput_11 : 35|12@0+ (0.01,0) [0|40.95] ""  Host
 SG_ AnalogInput_10 : 19|12@0+ (0.01,0) [0|40.95] ""  Host

vromanov ★★★
() автор топика
Ответ на: комментарий от beastie

Только поля названы с ведущиму нулями.

vromanov ★★★
() автор топика

А зачем там вообще делать 0 перед цифрой?

Это конечно можно обойти, например через придлывание внешнего препроцессора

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 2)

Вот например через энумы

enum nums
{
    n_00 = 0,
    n_01,
    n_02,
    n_03,
    n_04,
    n_05,
    n_06,
    n_07,
    n_08,
    n_09,
    n_10,
    n_11
// ...
};

#define XXX(n) ar[n_##n]=s._field_##n;
XXX(01);
XXX(02);
XXX(03);
XXX(04);
XXX(05);
XXX(06);
XXX(07);
XXX(08);
Можно сделать что-то такое, но я не думаю что это чем-то лучше, чем исходный вариант:
#define XXX(n) ar[1##n-100]=s._field_##n;

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от SZT
#define XXX(n) ar[10*(0x##n >> 4) + (0x##n & 0x0F)]=s._field_##n;

Еще одно «гениальное» решение

SZT ★★★★★
()
Ответ на: комментарий от SZT

например, чтобы идентификаторы имели одинаковую длинну, сортировались нормально итд.

vromanov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.