|
|
  |
Множественный выбор, оператор switch, язык С |
|
|
|
Dec 22 2010, 04:08
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (MrYuran @ Dec 22 2010, 08:46)  CODE const char ascii_value_table[3][256] = { "000","001", ... "256" } Как-то так... const char ascii_value_table[ 4][256]. И действительно быстрее. И компактнее. Аплодисменты!
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 22 2010, 04:41
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
И компактнее :-D — строки всё равно место занимают, а кода меньше даже при табличной реализации switch :-) _demПо поводу операций / % — «если уж так по́шло», то тогда через div_t div(value, 100), практически в два раза быстрее. В смысле стандартную библиотеку языка хотя бы глянуь стоит. Цитата(Сергей Борщ @ Dec 22 2010, 09:08)  const char ascii_value_table[4][256]. И действительно быстрее. И компактнее. Аплодисменты! можно и [3] — если выводить посимвольно или с форматом "%3.3s", оно тогда до отсутствующего терминатора и не дойдёт. Можно даже "%4.3s", пробельчик перед числом добавить.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Dec 22 2010, 04:47
|

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

|
Цитата(sergeeff @ Dec 22 2010, 10:14)  Автору эти три байта через com-порт наружу передавать и зачем там супер скорость преобразования char->ascii? А 1К под таблицу это не накладно ли будет? Ну это уж автору виднее - что ему дороже, объём или скорость. Если у меня свободно 30к флеши из 60 и 1к ОЗУ из 2-х, то я не парясь встраиваю функции, размещаю таблицы и щедро развешиваю в памяти хендлы на периферию и виртуальные таймеры с оверхедом в 3-4 раза. 1к в флеши - совершенный пустяк, на мой взгляд. В ОЗУ - да, может быть серьёзно (для AVR), а может быть тоже ерунда (для ARM с 512к ОЗУ)
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Dec 22 2010, 04:54
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (ReAl @ Dec 22 2010, 09:41)  можно и [3] — если выводить посимвольно или с форматом CODE char const TTT[][3] = { "123", "123" }; QUOTE error: initializer-string for array of chars is too long И все попутали порядок задания размерностей.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 22 2010, 05:41
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970

|
ReAL По поводу операций / % — «если уж так по́шло», то тогда через div_t div(value, 100), практически в два раза быстрее. В смысле стандартную библиотеку языка хотя бы глянуь стоит. [/quote] Угу, а можно еще цикл поставить. А еще вместо процедуры отправки поставить макрос, что в данном случае на AVR сэкономит, если склероз не подводит, 1 такт по скорости. А еще сделать таблицу в флеше с инструкциями на каждый случай (т.е. не таблицу адресов функций, а таблицу с кодами ) Это будет ну вообще быстро.
|
|
|
|
|
Dec 22 2010, 09:07
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
для байта на авр можно так: Код void itoa_byte(unsigned char n, unsigned char *s) { unsigned char ch = 0;
if ((n >= 100) && (++ch)) { n -= 100; if ((n >= 100) && (++ch)) n -= 100; }
*s++ = ch + 0x30;
ch = (n * 157U + (n << 8)) >> 12; *s++ = ch + 0x30;
ch <<= 1; n -= ch; ch <<= 2; n -=ch; *s++ = n + 0x30; } достаточно быстро и компактно а лучше так: Код void itoa_byte(unsigned char n, unsigned char *s) { unsigned char ch = 0x30;
if ((n >= 100) && (++ch) && ((n -= 100) >= 100) && (++ch)) n -= 100; *s++ = ch;
ch = (n * 157U + (n << 8)) >> 12; *s++ = ch + 0x30;
ch <<= 1; n -= ch; ch <<= 2; n -=ch; *s++ = n + 0x30; } не, лучше всего так: Код void itoa_byte(unsigned char n, unsigned char *s) { unsigned char ch = 0x30;
if ((n >= 100) && (++ch) && ((n -= 100) >= 100) && (++ch)) n -= 100; *s++ = ch;
ch = n * 157U >> 8; ch += n; ch >>= 4; *s++ = ch + 0x30;
ch <<= 1; n -= ch; ch <<= 2; n -=ch; *s++ = n + 0x30; }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|