Aneg 0 21 декабря, 2010 Опубликовано 21 декабря, 2010 · Жалоба Программирую на С для микроконтроллеров AVR. Насколько большим может быть этот множественный выбор у оператора switch? Сделал пробный вариант программы на 20 вариантов выбора - работает, а вот на 256 - нет не работает. А нужно сделать выбор для 1024 вариантов. А как поступить в этом случае? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 21 декабря, 2010 Опубликовано 21 декабря, 2010 · Жалоба Упаси вас и сохрани от таких программ! Подумайте, зачем вам это надо. Почти всегда можно придумать что-то взамен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_dem 0 21 декабря, 2010 Опубликовано 21 декабря, 2010 · Жалоба Switch реализуется через near jump, то есть ограничен +- 127 байт (поправьте, если забыл :) ). А чем таблица функций не угодила ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 21 декабря, 2010 Опубликовано 21 декабря, 2010 · Жалоба а вот на 256 - нет не работает. А нужно сделать выбор для 1024 вариантов. Вы забыли рассказать, что за компилер и что за целевой камень, и что значит "не работает" Упаси вас и сохрани от таких программ! Подумайте, зачем вам это надо. Почти всегда можно придумать что-то взамен. Protothreads не в счет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 21 декабря, 2010 Опубликовано 21 декабря, 2010 · Жалоба Ну и где там switch на 256 case? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aneg 0 21 декабря, 2010 Опубликовано 21 декабря, 2010 (изменено) · Жалоба Компилятор: ICCV7 for AVR (http://www.imagecraft.com/), целевой камень ATmega16. С помощью АЦП оцифровываю напряжение, пока ограничился на 256 уровнях (8 бит). Далее это значение передается по COM порту в виде 3-х байт ASCII кода. Выбор на switch применяю для перехода от 1-байтового значения к 3-м байт ASCII кода. Изменено 21 декабря, 2010 пользователем Aneg Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 21 декабря, 2010 Опубликовано 21 декабря, 2010 · Жалоба С ума сойти можно. 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 21 декабря, 2010 Опубликовано 21 декабря, 2010 · Жалоба или если надо точно 3 байта ASCIIА у него через switch() быстрее было! ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 21 декабря, 2010 Опубликовано 21 декабря, 2010 · Жалоба Ну и где там switch на 256 case? :bb-offtopic: это уж зависит от сложности реализуемого алгоритма. Можно и на 1024 и больше :) если психануть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 22 декабря, 2010 Опубликовано 22 декабря, 2010 · Жалоба Если в switch больше 10...20 вариантов (в зависимости от обрабатываемых значений), то я преобразую выбор через таблицу (даже вызов функций). Табличный метод выбора из большого числа значений гораздо выгоднее и по количеству используемой памяти, и по скорости выбора вырианта (всегда одинаковое фиксированное время выбора варианта) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_dem 0 22 декабря, 2010 Опубликовано 22 декабря, 2010 · Жалоба Продолжим фантазировать :) Цикл опущен специально . unsigned char ADCValue = ADC_Read(xxx); USART_Send( ADCValue / 100 ); ADCValue = ADCValue % 100; USART_Send( ADCValue / 10 ); ADCValue = ADCValue % 10; USART_Send( ADCValue ); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 22 декабря, 2010 Опубликовано 22 декабря, 2010 · Жалоба const char ascii_value_table[3][256] = { "000","001", ... "256" } Как-то так... Если не так, поправьте, пожалуйста, некогда думать, да и лень Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 22 декабря, 2010 Опубликовано 22 декабря, 2010 · Жалоба Продолжим фантазировать :) Скачайте хоть какую-нить мудрую книжку себе типа такого прежде чем смешить новизной подхода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 22 декабря, 2010 Опубликовано 22 декабря, 2010 · Жалоба А у него через switch() быстрее было! ;) Я привел пару примеров только для того, чтобы человек не зацикливался на switch/case. Ясно, что его задачу можно решить еще десятком разных вариантов с разным соотношением скорость/объем кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 22 декабря, 2010 Опубликовано 22 декабря, 2010 · Жалоба Как-то так... Если не так, поправьте, пожалуйста, некогда думать, да и лень ... и еще и быстрее будет, чем switch() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться