реклама на сайте
подробности

 
 
> генерация дефайнов, макросы препроцессора
SpiritDance
сообщение Jul 7 2008, 05:44
Сообщение #1


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



А как бы так извернутся с препроцессором?

Требуется код примерно такого вида:
Код
/* знгачения идут по порядку от базового целого */
#define X1 1200
#define X2 1201
#define X3 1203
.....
#define XN 12..

/* A1 и A2 идут в начаеле и они разных значений */
const t_mytype X_struct_array =
{
   A1, 0, {0},
   A2, 0, {0},
   X1, 0, {0},
   X2, 0, {0},
   .....
   XN, 0, {0}
}

где N зависит от модели устройства

Вопрос в том как сделать, чтобы не набивать X1 X2.. Xn а просто задать количество N и код сгенерился бы препроцессором?
постоянно сталкиваюсь с такой проблемой, а решения так и не нашел. Хочется уже один раз разобратся и не терять больше времени на возню.
Извиняюсь если не в тот раздел, больше не нашел куда приткнуть.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vmp
сообщение Jul 7 2008, 09:09
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Лови решение для N < 100. Единственный недостаток - что N нужно разбивать на единицы и десятки вручную. Проверен на IAR C для ARM.
Пример для N=73:
Код
//#define ITEM(n) X##n
// Генерация единиц - служебные макросы
#define GEN0(n)
#define GEN1(n)  ITEM(n##0)
#define GEN2(n)  ITEM(n##0),ITEM(n##1)
#define GEN3(n)  ITEM(n##0),ITEM(n##1),ITEM(n##2)
#define GEN4(n)  ITEM(n##0),ITEM(n##1),ITEM(n##2),ITEM(n##3)
#define GEN5(n)  ITEM(n##0),ITEM(n##1),ITEM(n##2),ITEM(n##3),ITEM(n##4)
#define GEN6(n)  ITEM(n##0),ITEM(n##1),ITEM(n##2),ITEM(n##3),ITEM(n##4),ITEM(n##5)
#define GEN7(n)  ITEM(n##0),ITEM(n##1),ITEM(n##2),ITEM(n##3),ITEM(n##4),ITEM(n##5),ITEM(n##6)
#define GEN8(n)  ITEM(n##0),ITEM(n##1),ITEM(n##2),ITEM(n##3),ITEM(n##4),ITEM(n##5),ITEM(n##6),ITEM(n##7)
#define GEN9(n)  ITEM(n##0),ITEM(n##1),ITEM(n##2),ITEM(n##3),ITEM(n##4),ITEM(n##5),ITEM(n##6),ITEM(n##7),ITEM(n##8)
#define GEN10(n) ITEM(n##0),ITEM(n##1),ITEM(n##2),ITEM(n##3),ITEM(n##4),ITEM(n##5),ITEM(n##6),ITEM(n##7),ITEM(n##8),ITEM(n##9)

// Генерация десятков - служебные макросы
#define GEND0(n)
#define GEND1(n)  GEN10(n##0)
#define GEND2(n)  GEN10(n##0),GEN10(n##1)
#define GEND3(n)  GEN10(n##0),GEN10(n##1),GEN10(n##2)
#define GEND4(n)  GEN10(n##0),GEN10(n##1),GEN10(n##2),GEN10(n##3)
#define GEND5(n)  GEN10(n##0),GEN10(n##1),GEN10(n##2),GEN10(n##3),GEN10(n##4)
#define GEND6(n)  GEN10(n##0),GEN10(n##1),GEN10(n##2),GEN10(n##3),GEN10(n##4),GEN10(n##5)
#define GEND7(n)  GEN10(n##0),GEN10(n##1),GEN10(n##2),GEN10(n##3),GEN10(n##4),GEN10(n##5),GEN10(n##6)
#define GEND8(n)  GEN10(n##0),GEN10(n##1),GEN10(n##2),GEN10(n##3),GEN10(n##4),GEN10(n##5),GEN10(n##6),GEN10(n##7)
#define GEND9(n)  GEN10(n##0),GEN10(n##1),GEN10(n##2),GEN10(n##3),GEN10(n##4),GEN10(n##5),GEN10(n##6),GEN10(n##7),GEN10(n##8)
#define GEND10(n) GEN10(n##0),GEN10(n##1),GEN10(n##2),GEN10(n##3),GEN10(n##4),GEN10(n##5),GEN10(n##6),GEN10(n##7),GEN10(n##8),GEN10(n##9)

// А вот это надо вызывать для генерации кода
#define GEND(d,s,n) GEND##d(n),GEN##s(n##d)

// Макрос, генерящий одну запись. Надо переопределять
#define ITEM(n) X##n

typedef enum {
Xm1 = 1199,
GEND(7,3,)} T_XX;

typedef struct {
T_XX x;
int a, b;
} T_MS;

// Еще одна генерация
#undef ITEM
#define ITEM(n) {X##n, 0, 0}

const T_MS zzz[] = {
{Xm1, 0},
{Xm1, 0},
GEND(7,3,)
};
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016