Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 30.04.2018, 13:52  
Unichorn
Временная регистрация
 
Регистрация: 29.05.2005
Адрес: где-то в 300км от Красноярска
Сообщений: 76
Сказал спасибо: 4
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
Unichorn на пути к лучшему
По умолчанию Re: Как реализовать на С

Но сработает то только первый if в функции.

return там не просто так стоит.
Реклама:

Последний раз редактировалось Unichorn; 30.04.2018 в 13:54.
Unichorn вне форума  
Непрочитано 30.04.2018, 14:14  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Как реализовать на С

Чтобы не было простыней при большом количестве вариантов:

Например, если все значения, с которыми сравниваем - последовательный ряд вида х, х+50, х+50*2, х+50*3...

Код:
#define x_base       550
#define x_increment   50

uint8_t test (uint16_t x)
{
  uint8_t result = 1;
  
  if (x ‹ x_base) return 0;
  x -= x_base;
  
  while (x › x_increment)
 {
    x -= x_increment;
    result++;
 }

  return result;
}

///somewhere in code
switch (test(x))
{
  case 0:
  //group 0;
  break;

  case 1:
  //group 1
  break;

  case 2:
  //group 2
  break;

...

  default:
  //group default
}
Если же ряд имеет неравномерные приращения, то test(x) немного усложняется, но не сильно: все так же задаем минимальное значение, а вместо константы приращения задаем массив констант, и в цикле while используем на каждой итерации очередное значение из этого массива. Или просто задаем массив констант значений и сравниваем с ними.

Работает всё это ничуть не лучше (строго говоря, даже чуть-чуть, на единицы тактов медленней)) просто "монструозной" портянки if-ов, но управляться с таким кодом не в пример легче, и когда все значения приращений в одном месте и перед глазами - ввести в каком-то из значений 540 вместо 450, и не заметить это вероятность куда меньше, чем в длиннющей простыне кода.

Но лично моя практика показывает, что "монструозную портянку" люди почти всегда используют просто для того, чтоб получить выходное значение в зависимости от входного по некоей нелинейной функции (был тут яркий пример)))). И вот тут лучше забыть про все эти ифы и свитчи, и таки написать полиномиальную функцию, которая будет выдавать результат расчета - причем делать это плавно, а не грубыми скачками.

Благо в наше время для этого и математику учить не надо, вбил точки в CurveExpert, оно и расписало требуемый полином

Последний раз редактировалось AR_Favorit; 30.04.2018 в 14:20.
AR_Favorit вне форума  
Непрочитано 30.04.2018, 14:28  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,375
Сказал спасибо: 176
Сказали Спасибо 3,128 раз(а) в 2,017 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: Как реализовать на С

да нахрен вся эта городьба???
а еще пишут истории как американцы дурью маются и пишут по 5 страниц когда можно в 1 формулу написать.

if (x›100&&x‹200) {}
if (x›200&&x‹300) {}
if (x›300&&x‹400) {}
if (x›400&&x‹500) {}

она и эта запись нелаконична и реально можно в 1-2 формулы уписать
__________________
кагмаподэ магмаподэ
индюк вне форума  
Непрочитано 30.04.2018, 14:31  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Как реализовать на С

Сообщение от индюк Посмотреть сообщение
да нахрен вся эта городьба???
Сообщение от AR_Favorit Посмотреть сообщение
при большом количестве вариантов
..........
AR_Favorit вне форума  
Непрочитано 30.04.2018, 14:32  
Ara41
Почётный гражданин KAZUS.RU
 
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Как реализовать на С

Сообщение от индюк Посмотреть сообщение
if (x›100&&x‹200) {}
if (x›200&&x‹300) {}
if (x›300&&x‹400) {}
if (x›400&&x‹500) {}
а что насчет круглых чисел 200, 300 и т.д.? =)
Ara41 вне форума  
Непрочитано 30.04.2018, 14:49  
Исбанни
Прописка
 
Регистрация: 21.04.2018
Сообщений: 174
Сказал спасибо: 1
Сказали Спасибо 66 раз(а) в 53 сообщении(ях)
Исбанни на пути к лучшему
По умолчанию Re: Как реализовать на С

Хыыыы, чуваки, фигасе у вас тут траблы какие ))) Ыыыы, я фигею. Итс вэри биг проблэм!!!
х‹=200 не канает разве?
Исбанни вне форума  
Непрочитано 30.04.2018, 14:58  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,375
Сказал спасибо: 176
Сказали Спасибо 3,128 раз(а) в 2,017 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: Как реализовать на С

Сообщение от AR_Favorit Посмотреть сообщение
..........
при болшом количестве вариантов просто пишешь формулу с такими операторами как поделить и вычесть.

и вообще задача не ясна. что за устройство непонятно
похоже на массив кнопок
__________________
кагмаподэ магмаподэ
индюк вне форума  
Непрочитано 30.04.2018, 14:59  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Как реализовать на С

Сообщение от индюк Посмотреть сообщение
при болшом количестве вариантов просто пишешь формулу с такими операторами как поделить и вычесть.
фсепанятна
AR_Favorit вне форума  
Непрочитано 30.04.2018, 15:01  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Как реализовать на С

Сообщение от Исбанни Посмотреть сообщение
фигасе у вас тут траблы какие
Раздел называется "вопросы новичков". Что ты тут ожидал увидеть? ))
AR_Favorit вне форума  
Непрочитано 30.04.2018, 15:08  
Исбанни
Прописка
 
Регистрация: 21.04.2018
Сообщений: 174
Сказал спасибо: 1
Сказали Спасибо 66 раз(а) в 53 сообщении(ях)
Исбанни на пути к лучшему
По умолчанию Re: Как реализовать на С

)) Ожидал увидеть великий замес по теме: "Что лучше - switch, if или if-else?
Исбанни вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать "реализуемое" - цифровой фильтр TranceBooster Цифровые сигнальные процессоры 8 18.03.2011 22:35
Задание. Реализовать на attiny2313 doband Микроконтроллеры, АЦП, память и т.д 17 13.12.2010 18:28
Как реализовать на ATmeg8 или ATtiny датчик случайных чисел Don_Ambrosio Микроконтроллеры, АЦП, память и т.д 20 03.05.2008 21:06
Можно ли на AVR реализовать вот такую схемку? -Dmitriy- Микроконтроллеры, АЦП, память и т.д 9 14.05.2006 16:43


Часовой пояс GMT +4, время: 01:40.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot