Большой Воронежский Форум
» Программирование>ANSI C. Препроцессор? Заполнить const массив элементами другого const массива...
pt200___dr.ON 00:57 04.12.2010
Код:
const char AA[] = { 1, 2, 3, 4, 5};

#define CONV( a)   ( AA[ a]) 

const char out[] = { CONV( 1), CONV( 3), CONV( 2)};
Задача: в линкер должен поступить дамп массива out[], а не код для его генерации. т.е. нада чтото типа макромассива AA[]

Массив AA[] "временный", в коде не используется.
[Ответ]
Spectator 14:06 04.12.2010
Это задача поиска компилятора / настроек компиляции, который сделает так чтобы "в линкер поступил дамп массива". Предсказать как поведет себя сферический компилятор в вакууме выйдет навряд ли. [Ответ]
pt200___dr.ON 18:31 04.12.2010
Задача, чтобы в любом компиляторе это работало.
т.е. это должен выполнять препроцессор или любой компилятор, а не какойто заточенный именно для этого компилятор с какимито хитрыми настройками. Никах сферических компиляторов, ваккумов и тд.

Ну товарищи кто там на сях шпарил в молодости, а может и сейчас. Может есть какойто спосов получить значение из enum по индексу или еще как.

P.S. про то чтоб задефайнить все константы из первого массива, апотом вписывать во второй можно не рассказывать. В результате, наверное, надо получить работающий макрос CONV( хх)через массив или еще как. [Ответ]
Part!zan 23:53 04.12.2010
pt200___dr.ON, афаик, стандарт такого не предусматривает. Напиши свой препроцессор и тогда результат будет одинаков на любом компиляторе. [Ответ]
alexz 00:30 06.12.2010
вот это не подходит? использовался знак ##.
Однако занятная задача сделать макромассив. Темплейтомассив вот сделать гораздо легче.

#define AA_0 1
#define AA_1 2
#define AA_2 3
#define AA_3 4
#define AA_4 5

#define CONV(a) ( AA_##a)

const char out[] = { CONV( 1), CONV( 3), CONV( 2)}; [Ответ]
pt200___dr.ON 08:26 06.12.2010
alexz, интересно. Так можно для нескольких элементов организовать.

P.S. Теперь бы еще для сотни как нибудь сделать( а то чтото не радует столько констант набивать) [Ответ]
alexz 18:26 06.12.2010
Да, самому интересно. Но пока вариантов не вижу.

Разве что задать какую-нибудь псевдо-функцию вместо массива int arr[]={100,200,300,......}
#define arr(idx) idx==0? 100 idx==1)?200: (idx==2)?300: (idx==3)?300: (idx==4 ...
и так все эти сотни элементов фигачить.
А потом надеяться что так как idx константа, то компилятор это всё посчтает в компайл-тайм и заменит на число.

А вообще интересно откуда возникла такая задача?
[Ответ]
pt200___dr.ON 18:48 06.12.2010

Сообщение от alexz:
...Разве что задать какую-нибудь псевдо-функцию вместо массива int arr[]={100,200,300,......}
#define arr(idx) idx==0? 100 idx==1)?200: (idx==2)?300: (idx==3)?300: (idx==4 ...
и так все эти сотни элементов фигачить.
А потом надеяться что так как idx константа, то компилятор это всё посчтает в компайл-тайм и заменит на число.

это еще хуже констант

Сообщение от alexz:
А вообще интересно откуда возникла такая задача?

микромикроконтроллер
( 1к флеши, 64 байта ОЗУ, скорострельность низкая)
так что конструкции типа A[B[ i]] не оставляют ресурсов для основного кода
[Ответ]
alexz 20:25 06.12.2010
А, понял. наноконтроллер для домофона наверное? ну тут уже предлагали свой "как бы препроцессор" сделать - софтинку которая возьмёт массив AA[] и описание отображения out[], и сгенерит по ним сишный код. Который потом можно будет заинклюдить. Можно её вызов в make-файл вставить кстати. [Ответ]
Вверх