Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
С standart: как создать "вывернутый" массив перед компиляцией.... |
Философия, технологии, алгоритмы! |
|
Опции темы |
07.06.2012, 13:36 | #1 |
бывший dr.ON
Сообщений: 205
Регистрация: 16.06.2010
Возраст: 41
Не в сети |
С standart: как создать "вывернутый" массив перед компиляцией....
т.е. задача избавиться от такого кода на этапе компиляции
CONST_ - расчитываются препроцессором Код:
int a[ 100]; memset( a, 0xFF, sizeof( a)); a[ CONST0] = 0; a[ CONST1] = 1; a[ CONST2] = 2; a[ CONST3] = 3; ... a[ CONST9] = 9; Код:
const int a[ 100] = { ....} Код:
const int _a[ 10] = { CONST0, CONST1, CONST2, CONST3,.... CONST9} int convert( int in_data) { int res = -1; for( int q = 0; q < ( sizeof( _a) / sizeof( _a[ 0])); q++) if( _a[ q] == in_data) { res = q; break; } return res; } Код:
const int a[ 100] = {......} int convert( int in_data) { return a[ in_data]; } P.S. Цель. оптимизация Последний раз редактировалось pt200___dr.ON; 07.06.2012 в 15:33. |
07.06.2012, 14:59 | #2 |
Форумец
Сообщений: 40,090
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Не очень понял, но попой чую что тебе нужен std::map
http://ru.wikipedia.org/wiki/%C0%F1%...E0%F1%F1%E8%E2 или тебе нужно на чистом С? без плюсов. |
07.06.2012, 15:23 | #3 | |
бывший dr.ON
Сообщений: 205
Регистрация: 16.06.2010
Возраст: 41
Не в сети |
Цитата:
P.S. Блин, даже незнаю как еще подробнее задачу сформулировать( генерация данных для табличного преобразования одного в другое). Код:
const int a[ 10] = { CONST0, CONST1, CONST2, CONST3,.... CONST9}; // CONST < 100 int coder( int in_data) // in_data < 10 { return a[ in_data]; // Out < 100 } const int b[ 100] = { ...}; int decoder( int in_data) { return b[ in_data]; } Код:
#define SEGMENT_A 0x10 #define SEGMENT_B 0x08 #define SEGMENT_C 0x00 #define SEGMENT_D 0x00 #define SEGMENT_E 0x04 #define CONST0 (SEGMENT_A|SEGMENT_B|SEGMENT_C|SEGMENT_D|SEGMENT_E|SEGMENT_F) P.S. Получается надо типа интерпрератора С Последний раз редактировалось pt200___dr.ON; 07.06.2012 в 15:45. |
|
07.06.2012, 16:45 | #4 |
Форумец
Сообщений: 40,090
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Ну как вариант я в одной фирме видел программу, которая на основании определенных параметров генерировала CPP/H классы. В твоем случае на входе нужно будет подавать число, а на выходе получать C файл со строкой
const int a[N] = {0, 1, 2, 3,.... N-1}; И его присоединить отдельным файлом в проект, а из других CPP файлов массив просто объявить. Посмотри, там обсуждение как раз по твоему вопросу. http://bytes.com/topic/c/answers/637...rocessing-loop Конкретно вот это кажется мне интересным http://bytes.com/topic/c/answers/637...oop#post242273 |
07.06.2012, 17:36 | #5 |
бывший dr.ON
Сообщений: 205
Регистрация: 16.06.2010
Возраст: 41
Не в сети |
Чтото не очень похоже.
Как мне кажется препроцессор с такой задачей не справиться, т.к. он не занимается вычислениями( т.е. 1+2+3 он не заменит на 6). т.е. самое простое это компилить тулзу( на тех же С)( которая используя нужные ашки и массив, генерит на выходе требуеммый массив) |
08.06.2012, 11:56 | #6 | |
Форумец
Сообщений: 40,090
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Цитата:
|
|
08.06.2012, 19:14 | #7 | |||
бибизьян
Сообщений: 3,031
Регистрация: 17.02.2004
Не в сети |
pt200___dr.ON, а можно с самого начала задачу, откуда берется код с define-ами? Если вы его пишите сами, то что мешает оформить его в виде макроса, который определит оба массива или развернет переданные параметры, или вообще создать это все в рантайме вызовом функции? Если вы его чем-то генерите, то может надо там пошаманить?
Цитата:
Цитата:
SEGMENT_A|SEGMENT_B|SEGMENT_C|SEGMENT_D|SEGMENT_E он сделает 0x10|0x08|0x00|0x00|0x04 Цитата:
|
|||
08.06.2012, 21:15 | #8 |
бывший dr.ON
Сообщений: 205
Регистрация: 16.06.2010
Возраст: 41
Не в сети |
Исходная задача( микроконтроллеры) данный код оптимизировать по скорости, экономя ресурсы( особенно RAM)
Код:
#define SEGMENT_A 0x10 #define SEGMENT_B 0x08 #define SEGMENT_C 0x40 #define SEGMENT_D 0x20 #define SEGMENT_E 0x04 #define SEGMENT_F 0x02 #define SEGMENT_G 0x01 const unsigned char symbols[] = { SEGMENT_A|SEGMENT_B|SEGMENT_C|SEGMENT_D|SEGMENT_E|SEGMENT_F, SEGMENT_B|SEGMENT_C, SEGMENT_A|SEGMENT_B|SEGMENT_D|SEGMENT_E|SEGMENT_G, SEGMENT_A|SEGMENT_B|SEGMENT_C|SEGMENT_D|SEGMENT_G, SEGMENT_B|SEGMENT_C|SEGMENT_F|SEGMENT_G, SEGMENT_A|SEGMENT_C|SEGMENT_D|SEGMENT_F|SEGMENT_G, SEGMENT_A|SEGMENT_C|SEGMENT_D|SEGMENT_E|SEGMENT_F|SEGMENT_G, SEGMENT_A|SEGMENT_B|SEGMENT_C, SEGMENT_A|SEGMENT_B|SEGMENT_C|SEGMENT_D|SEGMENT_E|SEGMENT_F|SEGMENT_G, SEGMENT_A|SEGMENT_B|SEGMENT_C|SEGMENT_D|SEGMENT_F|SEGMENT_G, 0, SEGMENT_A|SEGMENT_D|SEGMENT_E|SEGMENT_F, // C SEGMENT_B|SEGMENT_C|SEGMENT_E|SEGMENT_F|SEGMENT_G, //H SEGMENT_E|SEGMENT_G, //r }; int get_symbol( unsigned char in_data) { for( int q = 0; q < ( sizeof( symbols) / sizeof( symbols[ 0])); q++) if( symbols[ q] == in_data) { return q; break; } return -1; } |
08.06.2012, 21:37 | #9 |
Форумец
Сообщений: 40,090
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
может поиск делением пополам поможет отцу русской демократии?
http://ru.wikipedia.org/wiki/%C4%E2%...EF%EE%E8%F1%EA он одновременно простой и крайне эффективный. единственный недостаток - данные должны быть отсортированы. |
08.06.2012, 22:34 | #10 |
бибизьян
Сообщений: 3,031
Регистрация: 17.02.2004
Не в сети |
pt200___dr.ON, массив symbols такой всегда или меняется?
Возможно ли изменение порядка следования элементов? ЗЫ. Да и вообще, насколько я понимаю, там максимум половина таблицы, т.е. даже если тупо создать еще один массив, то это всего лишь 127 байт. |
08.06.2012, 22:54 | #11 | |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Цитата:
но если смотреть на таблицу, я не понимаю почему нельзя тупо написать код который будет генерировать эти значения, и создать файл, из которого копи-пастом выдрать код. pt200___dr.ON Ты больше времени потратишь на оптимизацию чем на пользу от работы программы Если будет часто нужно - напишешь оптимизированный вариант. P.S. оптимизированный вариант программы генератора, а не кода. т.к. иначе совет противоречил бы твоему т.з. Последний раз редактировалось Hopkroft; 08.06.2012 в 23:17. |
|
08.06.2012, 23:19 | #12 | |
бывший dr.ON
Сообщений: 205
Регистрация: 16.06.2010
Возраст: 41
Не в сети |
Всегда
Можно что угодно. Если только Код:
get_symbol( SEGMENT_A|SEGMENT_B|SEGMENT_C|SEGMENT_D|SEGMENT_E|SEGMENT_F) == 0 get_symbol( SEGMENT_B|SEGMENT_C) == 1 ..... Код:
const int b[ 100] = { ...}; int get_symbol( unsigned char in_data) { return b[ in_data]; } Цитата:
Основной вопрос, где этот массив будет лежать в const/FLASH( что устраивает) или в RAM( слишком жирно). |
|
10.06.2012, 21:36 | #13 | |
Форумец
Сообщений: 864
Регистрация: 07.04.2006
Не в сети |
Цитата:
пишется достаточно быро под свои нужды на чём удобно. В чем трабл не понимаю. Так же как и причем тут оптимизация под однокристалки? и вообще если однокристалки и оптимизация - то причем тут си? пишите на ассемблере. |
|
11.06.2012, 00:57 | #15 |
highly mean
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35
Не в сети |
|
11.06.2012, 01:43 | #16 | |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Цитата:
вообщем задача о проектирование сферического коня в вакууме |
|
11.06.2012, 09:08 | #17 |
бывший dr.ON
Сообщений: 205
Регистрация: 16.06.2010
Возраст: 41
Не в сети |
silly, производительность switch зависит от компилятора( его настроек), самих индексов( на 0, 1, 2, 3...) может работать значительно быстрее, чем на каше( + разное время выполнения в зависимости от индекса).
Про размер кода я ничего не говорил. Но вообщето стоял вопрос не в оптимизации, а в способах генерации массива |
11.06.2012, 18:53 | #18 |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
|
11.06.2012, 19:18 | #19 |
бибизьян
Сообщений: 3,031
Регистрация: 17.02.2004
Не в сети |
Hopkroft, ну или тупо один раз написать прям в этой программе(массив-то никогда не меняется):
Код:
... int _b[sizeof( _a) / sizeof( _a[ 0])]; memset(_b,-1,sizeof(_a)); for(int i = 0; i < sizeof( _a) / sizeof( _a[ 0]); i++ ) _b[_a[i]] = i; printf( "_b[] = { %d", _b[0]); for(int i = 1; i < sizeof( _a) / sizeof( _a[ 0]); i++ ) printf( ", %d", _b[i]); printf(" };"); ... |
11.06.2012, 22:34 | #20 |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
|
11.06.2012, 23:12 | #21 |
бывший dr.ON
Сообщений: 205
Регистрация: 16.06.2010
Возраст: 41
Не в сети |
Hopkroft, Задача уже давно так и решена
Просто хочется надеяться, что есть более правильное решение задачи |
11.06.2012, 23:52 | #22 |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Я не думаю что тут можно было что-то заоптимизировать. Но как показывает практика оптимально решение или нет покажет только использование ПО и последующая модернизация кода. Вот тут и могут всплыть различные косяки.
|
13.06.2012, 00:37 | #23 |
Форумец
Сообщений: 40,090
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
|