реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Множественный выбор, оператор switch, язык С
Aneg
сообщение Dec 21 2010, 17:26
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 19-12-09
Пользователь №: 54 346



Программирую на С для микроконтроллеров AVR.
Насколько большим может быть этот множественный выбор у оператора switch? Сделал пробный вариант программы на 20 вариантов выбора - работает, а вот на 256 - нет не работает. А нужно сделать выбор для 1024 вариантов. А как поступить в этом случае?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 21 2010, 17:57
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Упаси вас и сохрани от таких программ! Подумайте, зачем вам это надо. Почти всегда можно придумать что-то взамен.
Go to the top of the page
 
+Quote Post
_dem
сообщение Dec 21 2010, 18:10
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



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

А чем таблица функций не угодила ?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 21 2010, 18:15
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Aneg @ Dec 22 2010, 00:26) *
а вот на 256 - нет не работает. А нужно сделать выбор для 1024 вариантов.

Вы забыли рассказать, что за компилер и что за целевой камень, и что значит "не работает"
Цитата(sergeeff @ Dec 22 2010, 00:57) *
Упаси вас и сохрани от таких программ! Подумайте, зачем вам это надо. Почти всегда можно придумать что-то взамен.

Protothreads не в счет? biggrin.gif
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 21 2010, 18:27
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Ну и где там switch на 256 case?
Go to the top of the page
 
+Quote Post
Aneg
сообщение Dec 21 2010, 18:31
Сообщение #6





Группа: Новичок
Сообщений: 5
Регистрация: 19-12-09
Пользователь №: 54 346



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

Сообщение отредактировал Aneg - Dec 21 2010, 18:35
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 21 2010, 18:44
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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

Код
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);
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 21 2010, 19:25
Сообщение #8


Гуру
******

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



QUOTE (sergeeff @ Dec 21 2010, 23:44) *
или если надо точно 3 байта ASCII
А у него через switch() быстрее было! wink.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 21 2010, 22:09
Сообщение #9


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(sergeeff @ Dec 22 2010, 00:27) *
Ну и где там switch на 256 case?

bb-offtopic.gif это уж зависит от сложности реализуемого алгоритма. Можно и на 1024 и больше sm.gif если психануть.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Dec 22 2010, 01:49
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Если в switch больше 10...20 вариантов (в зависимости от обрабатываемых значений), то я преобразую выбор через таблицу (даже вызов функций). Табличный метод выбора из большого числа значений гораздо выгоднее и по количеству используемой памяти, и по скорости выбора вырианта (всегда одинаковое фиксированное время выбора варианта)
Go to the top of the page
 
+Quote Post
_dem
сообщение Dec 22 2010, 03:13
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



Продолжим фантазировать sm.gif
Цикл опущен специально .

unsigned char ADCValue = ADC_Read(xxx);

USART_Send( ADCValue / 100 );

ADCValue = ADCValue % 100;
USART_Send( ADCValue / 10 );

ADCValue = ADCValue % 10;
USART_Send( ADCValue );
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Dec 22 2010, 03:46
Сообщение #12


Беспросветный оптимист
******

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



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

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 22 2010, 03:50
Сообщение #13


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(_dem @ Dec 22 2010, 10:13) *
Продолжим фантазировать sm.gif

Скачайте хоть какую-нить мудрую книжку себе типа такого прежде чем смешить новизной подхода.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 22 2010, 03:50
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Сергей Борщ @ Dec 22 2010, 02:25) *
А у него через switch() быстрее было! wink.gif


Я привел пару примеров только для того, чтобы человек не зацикливался на switch/case. Ясно, что его задачу можно решить еще десятком разных вариантов с разным соотношением скорость/объем кода.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 22 2010, 03:51
Сообщение #15


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(MrYuran @ Dec 22 2010, 10:46) *
Как-то так...
Если не так, поправьте, пожалуйста, некогда думать, да и лень

... и еще и быстрее будет, чем switch() lol.gif
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01536 секунд с 7
ELECTRONIX ©2004-2016