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

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

Программирую на С для микроконтроллеров AVR.

Насколько большим может быть этот множественный выбор у оператора switch? Сделал пробный вариант программы на 20 вариантов выбора - работает, а вот на 256 - нет не работает. А нужно сделать выбор для 1024 вариантов. А как поступить в этом случае?

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


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

Упаси вас и сохрани от таких программ! Подумайте, зачем вам это надо. Почти всегда можно придумать что-то взамен.

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


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

Switch реализуется через near jump, то есть ограничен +- 127 байт (поправьте, если забыл :) ).

 

А чем таблица функций не угодила ?

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


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

а вот на 256 - нет не работает. А нужно сделать выбор для 1024 вариантов.

Вы забыли рассказать, что за компилер и что за целевой камень, и что значит "не работает"

Упаси вас и сохрани от таких программ! Подумайте, зачем вам это надо. Почти всегда можно придумать что-то взамен.

Protothreads не в счет? :biggrin:

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


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

Компилятор: ICCV7 for AVR (http://www.imagecraft.com/), целевой камень ATmega16.

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

Изменено пользователем Aneg

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


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

С ума сойти можно.

 

char buf[4];

char inp;             // значение из АЦП
itoa(inp, buf, 10); // библиотечная функция, см. http://ru.wikipedia.org/wiki/Itoa_%28%D0%A1%D0%B8%29
send_to_port(buf, strlen(buf));

 

Все!!! Никаких switch/case.

 

или если надо точно 3 байта ASCII

 

int n = sprintf(buf, "%03d", inp);
send_to_port(buf, n);

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


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

или если надо точно 3 байта ASCII
А у него через switch() быстрее было! ;)

 

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


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

Ну и где там switch на 256 case?

:bb-offtopic: это уж зависит от сложности реализуемого алгоритма. Можно и на 1024 и больше :) если психануть.

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


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

Если в switch больше 10...20 вариантов (в зависимости от обрабатываемых значений), то я преобразую выбор через таблицу (даже вызов функций). Табличный метод выбора из большого числа значений гораздо выгоднее и по количеству используемой памяти, и по скорости выбора вырианта (всегда одинаковое фиксированное время выбора варианта)

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


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

Продолжим фантазировать :)

Цикл опущен специально .

 

unsigned char ADCValue = ADC_Read(xxx);

 

USART_Send( ADCValue / 100 );

 

ADCValue = ADCValue % 100;

USART_Send( ADCValue / 10 );

 

ADCValue = ADCValue % 10;

USART_Send( ADCValue );

 

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


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

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

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

Если не так, поправьте, пожалуйста, некогда думать, да и лень

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


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

Продолжим фантазировать :)

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

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


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

А у него через switch() быстрее было! ;)

 

Я привел пару примеров только для того, чтобы человек не зацикливался на switch/case. Ясно, что его задачу можно решить еще десятком разных вариантов с разным соотношением скорость/объем кода.

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


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

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

Если не так, поправьте, пожалуйста, некогда думать, да и лень

... и еще и быстрее будет, чем switch() :lol:

 

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


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

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

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

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

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

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

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

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

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

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