Перейти к содержанию
    

Множественный выбор, оператор switch

const char ascii_value_table[3][256] = {
"000","001", ... "256"
}

Как-то так...

const char ascii_value_table[4][256]. И действительно быстрее. И компактнее. Аплодисменты!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скачайте хоть какую-нить мудрую книжку себе типа такого прежде чем смешить новизной подхода.

 

Почитайте какую-нибудь мудрую инструкцию типа этой , прежде чем открывать эти ваши Интернеты :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Автору эти три байта через com-порт наружу передавать и зачем там супер скорость преобразования char->ascii? А 1К под таблицу это не накладно ли будет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вот, Вы - хамить, а я Вам -про преобразование в десятичный код методом сдвига... не помню страницу. Досвидоз!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И компактнее :-D — строки всё равно место занимают, а кода меньше даже при табличной реализации switch :-)

 

_dem

По поводу операций / % — «если уж так по́шло», то тогда через div_t div(value, 100), практически в два раза быстрее.

В смысле стандартную библиотеку языка хотя бы глянуь стоит.

 

const char ascii_value_table[4][256]. И действительно быстрее. И компактнее. Аплодисменты!
можно и [3] — если выводить посимвольно или с форматом "%3.3s", оно тогда до отсутствующего терминатора и не дойдёт.

Можно даже "%4.3s", пробельчик перед числом добавить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Автору эти три байта через com-порт наружу передавать и зачем там супер скорость преобразования char->ascii? А 1К под таблицу это не накладно ли будет?

Ну это уж автору виднее - что ему дороже, объём или скорость.

Если у меня свободно 30к флеши из 60 и 1к ОЗУ из 2-х, то я не парясь встраиваю функции, размещаю таблицы и щедро развешиваю в памяти хендлы на периферию и виртуальные таймеры с оверхедом в 3-4 раза.

1к в флеши - совершенный пустяк, на мой взгляд. В ОЗУ - да, может быть серьёзно (для AVR), а может быть тоже ерунда (для ARM с 512к ОЗУ)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можно и [3] — если выводить посимвольно или с форматом

char const TTT[][3] =
{
        "123",
        "123"
};

error: initializer-string for array of chars is too long
И все попутали порядок задания размерностей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну это уж автору виднее - что ему дороже, объём или скорость.

 

Автор как-то ушел в тень. Видимо от избытка чувств.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Автор как-то ушел в тень. Видимо от избытка чувств.

Он узнал, что кроме switch в языке Си, как не странно, существуют и другие операторы. :lol:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И все попутали порядок задания размерностей.

Ну я ж писал - думать лень :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ReAL

По поводу операций / % — «если уж так по́шло», то тогда через div_t div(value, 100), практически в два раза быстрее.

В смысле стандартную библиотеку языка хотя бы глянуь стоит.

Угу, а можно еще цикл поставить.

А еще вместо процедуры отправки поставить макрос, что в данном случае на AVR сэкономит, если склероз не подводит, 1 такт по скорости.

А еще сделать таблицу в флеше с инструкциями на каждый случай (т.е. не таблицу адресов функций, а таблицу с кодами ) Это будет ну вообще быстро.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Таких перлов я ещё не встречал!

Запас бодрости на весь оставшийся день! Похлеще чем :salmari: будет:-)

Браво!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

для байта на авр можно так:

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;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С помощью АЦП оцифровываю напряжение, пока ограничился на 256 уровнях (8 бит). Далее это значение передается по COM порту в виде 3-х байт ASCII кода. Выбор на switch применяю для перехода от 1-байтового значения к 3-м байт ASCII кода.

А если понадобится 16-разрядный АЦП?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...