Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Странное выражение.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
Переменные объявлены так.
Код
uint8_t txDelay;
unsigned int delay;

Далее в коде есть такая проверка.
Код
if (delay%txDelay==0)

Что человек хотел проверить делением по модулю?
gerber
Цитата(Jenya7 @ Dec 30 2014, 11:19) *
Что человек хотел проверить делением по модулю?

Условие будет истинным, когда delay кратно txDelay, то есть делится на него без остатка.
Такая конструкция может быть использована для исполнения кода каждые txDelay периодов, если delay увеличивается каждый период.
Например, если каждые 1 мс delay увеличивать на 1, а txDelay = 5, то код под условием if будет выполняться каждые 5 мс.
ae_
Я ответил на похожий ваш вопрос в соседней ветке:
Цитата(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.
Jenya7
Цитата(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.

и действительно sm.gif

p.s не! не меняется!

ааа... понял в чем тут дело . спасибо.
Jenya7
Код
if !(counter % 100) PulseOut();

тут есть проблема.
если счетчик обновляется медленно то это условие присутствует какое то время и я получу несколько пульсов вместо одного.
gerber
Цитата(Jenya7 @ Dec 30 2014, 15:38) *
Код
if !(counter % 100) PulseOut();

тут есть проблема.
если счетчик обновляется медленно то это условие присутствует какое то время и я получу несколько пульсов вместо одного.

Логично ставить проверку условия после обновления счётчика.
Если никак, тогда тоже есть варианты:
Код
if !(counter % 100) PulseUp();
else PulseDown();

или даже так:
Код
if !(counter % 101)
{
  counter++;
  PulseOut();
}

biggrin.gif
Jenya7
Цитата(gerber @ Dec 30 2014, 21:14) *
Логично ставить проверку условия после обновления счётчика.
Если никак, тогда тоже есть варианты:
Код
if !(counter % 100) PulseUp();
else PulseDown();

biggrin.gif


это неплохое решение хотя PulseDown() тяжеловат у меня и все время молотить его накладно. sm.gif

gerber
Цитата(Jenya7 @ Dec 30 2014, 19:44) *
это неплохое решение хотя PulseDown() тяжеловат у меня и все время молотить его накладно. sm.gif

Код
switch(counter % 100)
{
  case 0:
    PulseUp();
    break;
  case 1:
    PulseDown();
    break;
}

biggrin.gif
_Pasha
интересно, сколько индусов читает эту ветку biggrin.gif
Рэбята, ви все под гипнозом? Что это:
Код
if(counter % 100)

?
Код
if(counter >= 100)
{
  counter = 0;
  toggle();
}

где вы видели проц в котором посчитать модуль дешевле чем сравнить?
вот так говнокод и получается.
Jenya7
Цитата(_Pasha @ Dec 31 2014, 07:28) *
интересно, сколько индусов читает эту ветку biggrin.gif
Рэбята, ви все под гипнозом? Что это:
Код
if(counter % 100)

?
Код
if(counter >= 100)
{
  counter = 0;
  toggle();
}

где вы видели проц в котором посчитать модуль дешевле чем сравнить?
вот так говнокод и получается.

у нас с ae_ была дискусия о другом топике. надо было отследить изменение третьей цифры справа. скажем было 000199 стало 000200. отсюда модули и прочие навороты.
WitFed
Цитата(_Pasha @ Dec 31 2014, 04:28) *
интересно, сколько индусов читает эту ветку biggrin.gif
Рэбята, ви все под гипнозом? Что это:
...

Пахан, не гони -- тут прозрачно обсуждался принцип, хотя мне не нравятся условия типа "if !(counter % 100) ...", а компилятору тем более.
Какой народ двинул во программеры -- такой и [г]кодит, наушники с бурдой не снимая и портя кармы о 9D...
В реальной обстановке можно counter наращивать и сравнивать с верхним пределом 100, и по достижении обнулять.
Jenya7
Цитата(WitFed @ Dec 31 2014, 14:30) *
.
Какой народ двинул во программеры -- такой и [г]кодит, наушники с бурдой не снимая и портя кармы о 9D...

Gotan Project это не бурда. это самое то для програмера.
_Pasha
Цитата(Jenya7 @ Dec 31 2014, 10:37) *
у нас с ae_ была дискусия о другом топике. надо было отследить изменение третьей цифры справа. скажем было 000199 стало 000200. отсюда модули и прочие навороты.

Там это относится к преобразованию Bin -> BCD - это не вызывает смущения, ибо доказано, что модулями и делениями эффективнее всего выходит,
а в обсуждаемом примере - таймер wacko.gif или счетчик wacko.gif
Ну тогда конечно, если это сфероконь без предупреждения sm.gif - не смею вмешиваться.
SM
Цитата(_Pasha @ Dec 31 2014, 19:36) *
Там это относится к преобразованию Bin -> BCD - это не вызывает смущения, ибо доказано, что модулями и делениями эффективнее всего выходит,


А интересно, где и кем доказано?

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

Да, и плюс тому деление и остаток могут использоваться еще где-то, а вычитание 10 100 1000- вряд ли.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.