30.04.2018, 02:02
|
|
Прописка
Регистрация: 25.11.2008
Сообщений: 114
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Как реализовать на С
Как лучше организовать такое:
АЦП выдаёт результат.
Если он меньше, к примеру 550, надо делать группу операторов "0",
Если меньше 650 - "1".
Если меньше 750 - "2".
Ну и т.д.
При этом после выполнения, скажем "0", дальнейшие проверки (650, 750) проводить НЕ надо.
Вроде просится switch (с break после группы операторов).
Но оператор switch проверяет на равенство. А надо меньше или больше.
Городить что то из if ?
Но кудой там "вставить" break ?
|
|
|
|
30.04.2018, 02:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Как реализовать на С
if (x‹550)
{
//group 0
}
else if (x‹650)
{
//group 1
}
else if (x‹750)
{
//group 2
}
...
else
{
// group "default"
}
Но при большом количестве вариантов это ведет к монструозным простыням и в таких случаях обычно является признаком плохо построенного алгоритма.
|
|
|
Сказали "Спасибо" AR_Favorit
|
|
|
30.04.2018, 03:00
|
|
Прописка
Регистрация: 25.11.2008
Сообщений: 114
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: Как реализовать на С
Сообщение от AR_Favorit
|
монструозным
|
Прикольное словечко
Спасибо.
|
|
|
|
30.04.2018, 08:35
|
|
Прописка
Регистрация: 19.02.2008
Адрес: г. Иркутск
Сообщений: 277
Сказал спасибо: 218
Сказали Спасибо 171 раз(а) в 79 сообщении(ях)
|
Re: Как реализовать на С
Сигнал с ацп преобразовать делением в 1, 2, 3..
|
|
|
|
30.04.2018, 08:36
|
|
Прописка
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
|
Re: Как реализовать на С
Сообщение от DPANYTA
|
Прикольное словечко
Спасибо.
|
Не хотите монструозности - можно тоже самое сделать циклом по отсортированному массиву Nx2 с числами и указателями на функцию.
|
|
|
|
30.04.2018, 09:32
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
|
Re: Как реализовать на С
DPANYTA тут и if и switch вместе тоже подойдут
switch (ADC_range(ADC_value)) и далее case 1:, 2:,
А в функции ADC_range множество if для диапазона с return (вариант для case)
И монструозность не столь выраженная получится…
При соответствующем нормировании значения, уже из конкретных условий и требований задачи может и массив помочь.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
30.04.2018, 10:39
|
|
Прописка
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
|
Re: Как реализовать на С
Сообщение от mike-y-k
|
switch (ADC_range(ADC_value)) и далее case 1:, 2:,
|
На самом деле, если речь идет о целых числах, что и требуется при работе с АЦП, можно использовать расширение C.
Тот же GCC поддерживает задание в case диапазонов чисел:
Код:
|
uint8_t test(uint16_t adc_value)
{
uint8_t i;
switch (adc_value) {
case 0 ... 499: i=0; break;
case 500 ... 649: i=1; break;
case 650 ... 749: i=2; break;
default: i=7;
}
return i;
} |
Конечно, отклонение от стандартов языка не есть хорошо, но если проект пишется под конкретный МК и конкретный компилятор, то такое отклонение выглядит простительным.
Последний раз редактировалось ptr; 30.04.2018 в 10:54.
|
|
|
|
30.04.2018, 11:48
|
|
Временная регистрация
Регистрация: 29.05.2005
Адрес: где-то в 300км от Красноярска
Сообщений: 76
Сказал спасибо: 4
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Как реализовать на С
[HTML]
‹code›
unsigned shot Test(void)
{
if(adc_value ‹ 550)
{
......
return 0;
};
if(adc_value ‹ 650)
{
......
return 1;
};
if(adc_value ‹ 750)
{
......
return 2;
};
return 3;
}
‹/code›
[/HTML]
Как то так.
|
|
|
|
30.04.2018, 12:28
|
|
Заблокирован
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,715
Сказал спасибо: 189
Сказали Спасибо 3,199 раз(а) в 2,074 сообщении(ях)
|
Re: Как реализовать на С
if (x›500&&x‹600) {}
у меня вот так всегда работает
|
|
|
|
30.04.2018, 13:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 11.06.2006
Адрес: 51° 46′ 0″ N, 55° 6′ 0″ E
Сообщений: 1,975
Сказал спасибо: 370
Сказали Спасибо 1,726 раз(а) в 707 сообщении(ях)
|
Re: Как реализовать на С
Сообщение от Unichorn
|
Как то так.
|
Вопрос - число х = 333 удовлетворяет всем условиям сравнения? Или нет?
У вас же три три числовых диапазона, вот и определите их границы.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:59.
|
|