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

 
 
> генерация дефайнов, макросы препроцессора
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
Ответов (1 - 8)
Непомнящий Евген...
сообщение Jul 7 2008, 05:59
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Можно посмотреть тут:
http://www.boostpro.com/tmpbook/preprocessor.html

Я не разбирался с ним плотно, вроде как примерно то. Если еще получится выдрать это из boost и присобачить к иару smile.gif

А вообще может быть написать скрипт (на чем-нить типа питона\перла\пхп), который будет генерить нужный вам файл. Этот вариант дает максимальную свободу. Я таким образом обрабатываю строковые константы.

Еще можно посмотреть на более мощные препроцессоры типа M4. Но (имхо) вариант со скриптом проще.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 7 2008, 06:33
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



#define X(i) (1199+i)


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Jul 7 2008, 06:40
Сообщение #4


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

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



Цитата(MrYuran @ Jul 7 2008, 10:33) *
#define X(i) (1199+i)

Угу гениально smile.gif И как этим пользоватся?
Вот так? smile.gif
Код
#define X1   X(1)
#define X2   X(2)
#define X3   X(3)



За буст спасибо конечно, но по моему отцепить предлагаемое от шаблонов или хотя бы от библиотеки невозможно.(у меня мозгов не хватит точно sad.gif ) А нужно С без плюсов. sad.gif

Есть еще варианты? или только скриптовый язык типа перла?


--------------------
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
MrYuran
сообщение Jul 7 2008, 06:56
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(SpiritDance @ Jul 7 2008, 09:40) *
И как этим пользоватся?
Вот так? smile.gif

Нет, не так. Верхний блок заменяется одним дефайном, а уж нижний... фантазии не хватает.
Да ладно, это я так написал, пальцы размять после выходных


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
vmp
сообщение Jul 7 2008, 07:04
Сообщение #6


Местный
***

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



Можно чуть-чуть сократить количество писанины путем применения enum:
typedef enum {
X1 = 1201, X2, X3, X4, ..., XN} T_XX;

Дальше для генерации можно взять препроцессор, оператор ##:
#define GEN10(str) str##0, str##1, str##2 и т.д до str##9
тогда вызов GEN10(X5) сделает перечисление X50, X51, X52, ... X59
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 7 2008, 07:20
Сообщение #7


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Если не пугает небольшая кривость, то можно сделать так
Код
typedef struct
{
  int val;
}t_mytype;

#define XNEXT (__LINE__+1200)
const t_mytype X_struct_array[] = {
#include "x.h"
};


и файл x.h

Код
  {XNEXT},
  {XNEXT},
  {XNEXT},
  {XNEXT},
  {XNEXT},
  {XNEXT},
  {XNEXT},
  {XNEXT},
  {XNEXT},


Естественно, на x.h накладываются ограничения: одна строка - один элемент, пропусков быть не должно.

Результат после препроцессора таков:
Код
typedef struct
{
  int val;
}t_mytype;

const t_mytype X_struct_array[] = {
  {(1+1200)},
  {(2+1200)},
  {(3+1200)},
  {(4+1200)},
  {(5+1200)},
  {(6+1200)},
  {(7+1200)},
  {(8+1200)},
  {(9+1200)},
};


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
vet
сообщение Jul 7 2008, 07:44
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(SpiritDance @ Jul 7 2008, 09:44) *
где N зависит от модели устройства

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

Можно единожды сделать общий для всех устройств исходник, для большого N, с запасом, затем расставить #ifdef для разных устройств.
Последовательность чисел произвольной длины делается в экселе одним движением мыши.
Код
#if defined(DEVICE1)  || defined(DEVICE2) || defined(DEVICE3)
#define X1 1201
#define X2 1202
#endif
#if defined(DEVICE2) || defined(DEVICE3)
#define X3 1203
#define X4 1204
#endif
#if defined(DEVICE3)
#define X5 1205
#define X6 1206
#endif


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
vmp
сообщение Jul 7 2008, 09:09
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 21st July 2025 - 23:15
Рейтинг@Mail.ru


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