|
|
  |
Странное выражение. |
|
|
|
Dec 30 2014, 07:19
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Переменные объявлены так. Код uint8_t txDelay; unsigned int delay; Далее в коде есть такая проверка. Код if (delay%txDelay==0) Что человек хотел проверить делением по модулю?
|
|
|
|
|
Dec 30 2014, 07:41
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Цитата(Jenya7 @ Dec 30 2014, 11:19)  Что человек хотел проверить делением по модулю? Условие будет истинным, когда delay кратно txDelay, то есть делится на него без остатка. Такая конструкция может быть использована для исполнения кода каждые txDelay периодов, если delay увеличивается каждый период. Например, если каждые 1 мс delay увеличивать на 1, а txDelay = 5, то код под условием if будет выполняться каждые 5 мс.
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Dec 30 2014, 07:57
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Я ответил на похожий ваш вопрос в соседней ветке: Цитата(Jenya7 @ Dec 25 2014, 23:36)  ...то есть если было 00000199 и стало 00000200 выдать пульс...Очевидное решение такое Код digit = (counter / 100); //test 3-d digit if (digit != old_digit) { old_digit = digit; PulseOut(); } Вопрос а есть ли более быстрое решение? Цитата(ae_ @ Dec 27 2014, 00:03)  Что-то вроде этого? Код if !(counter % 100) PulseOut(); т.е. PulseOut() вызывается каждый раз, когда меняется третий разряд (сотни) переменной counter, вернее, когда counter кратен 100.
|
|
|
|
|
Dec 30 2014, 08:55
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(gerber @ Dec 30 2014, 13:41)  Условие будет истинным, когда delay кратно txDelay, то есть делится на него без остатка. Такая конструкция может быть использована для исполнения кода каждые txDelay периодов, если delay увеличивается каждый период. Например, если каждые 1 мс delay увеличивать на 1, а txDelay = 5, то код под условием if будет выполняться каждые 5 мс. спасибо за объяснение Цитата(ae_ @ Dec 30 2014, 13:57)  Я ответил на похожий ваш вопрос в соседней ветке:
т.е. PulseOut() вызывается каждый раз, когда меняется третий разряд (сотни) переменной counter, вернее, когда counter кратен 100. и действительно  p.s не! не меняется! ааа... понял в чем тут дело . спасибо.
Сообщение отредактировал Jenya7 - Dec 30 2014, 09:03
|
|
|
|
|
Dec 30 2014, 11:38
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Код if !(counter % 100) PulseOut(); тут есть проблема. если счетчик обновляется медленно то это условие присутствует какое то время и я получу несколько пульсов вместо одного.
|
|
|
|
|
Dec 30 2014, 15:14
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Цитата(Jenya7 @ Dec 30 2014, 15:38)  Код if !(counter % 100) PulseOut(); тут есть проблема. если счетчик обновляется медленно то это условие присутствует какое то время и я получу несколько пульсов вместо одного. Логично ставить проверку условия после обновления счётчика. Если никак, тогда тоже есть варианты: Код if !(counter % 100) PulseUp(); else PulseDown(); или даже так: Код if !(counter % 101) { counter++; PulseOut(); }
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Dec 30 2014, 15:44
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(gerber @ Dec 30 2014, 21:14)  Логично ставить проверку условия после обновления счётчика. Если никак, тогда тоже есть варианты: Код if !(counter % 100) PulseUp(); else PulseDown();  это неплохое решение хотя PulseDown() тяжеловат у меня и все время молотить его накладно.
|
|
|
|
|
Dec 31 2014, 01:28
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
интересно, сколько индусов читает эту ветку Рэбята, ви все под гипнозом? Что это: Код if(counter % 100) ? Код if(counter >= 100) { counter = 0; toggle(); } где вы видели проц в котором посчитать модуль дешевле чем сравнить? вот так говнокод и получается.
|
|
|
|
|
Dec 31 2014, 07:37
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(_Pasha @ Dec 31 2014, 07:28)  интересно, сколько индусов читает эту ветку Рэбята, ви все под гипнозом? Что это: Код if(counter % 100) ? Код if(counter >= 100) { counter = 0; toggle(); } где вы видели проц в котором посчитать модуль дешевле чем сравнить? вот так говнокод и получается. у нас с ae_ была дискусия о другом топике. надо было отследить изменение третьей цифры справа. скажем было 000199 стало 000200. отсюда модули и прочие навороты.
|
|
|
|
|
Dec 31 2014, 08:30
|
Местный
  
Группа: Свой
Сообщений: 271
Регистрация: 6-12-11
Из: Taganrog
Пользователь №: 68 701

|
Цитата(_Pasha @ Dec 31 2014, 04:28)  интересно, сколько индусов читает эту ветку Рэбята, ви все под гипнозом? Что это: ... Пахан, не гони -- тут прозрачно обсуждался принцип, хотя мне не нравятся условия типа "if !(counter % 100) ...", а компилятору тем более. Какой народ двинул во программеры -- такой и [г]кодит, наушники с бурдой не снимая и портя кармы о 9D... В реальной обстановке можно counter наращивать и сравнивать с верхним пределом 100, и по достижении обнулять.
|
|
|
|
|
Dec 31 2014, 16:51
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(_Pasha @ Dec 31 2014, 19:36)  Там это относится к преобразованию Bin -> BCD - это не вызывает смущения, ибо доказано, что модулями и делениями эффективнее всего выходит, А интересно, где и кем доказано? Раньше вроде было доказано, что эффективнее (в случае, если у процессора нет аппаратной поддержки деления) всего алгоритм, который по очереди в цикле вычитает сначала по 10000, потом по 1000, потом по 100, ну и т.д., считая каждый раз, сколько было вычитаний на каждом этапе. Так как, деление (в его двоичном исполнении в стандартной либе) всегда имеет столько итераций вычитания, сколько разрядность числа, для каждой цифры (допустим, 16), а в данном случае - делении сразу в десятичном исполнении - на каждую цифру уходит от 1 до 10 итераций вычитания, что по любому меньше. А объем кода, в пересчете на его размер в машинных кодах, плюс-минус копейки, одинаков.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|