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

 
 
 
Reply to this topicStart new topic
> Странное выражение.
Jenya7
сообщение Dec 30 2014, 07:19
Сообщение #1


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Переменные объявлены так.
Код
uint8_t txDelay;
unsigned int delay;

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

Что человек хотел проверить делением по модулю?
Go to the top of the page
 
+Quote Post
gerber
сообщение Dec 30 2014, 07:41
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



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

Условие будет истинным, когда delay кратно txDelay, то есть делится на него без остатка.
Такая конструкция может быть использована для исполнения кода каждые txDelay периодов, если delay увеличивается каждый период.
Например, если каждые 1 мс delay увеличивать на 1, а txDelay = 5, то код под условием if будет выполняться каждые 5 мс.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
ae_
сообщение Dec 30 2014, 07:57
Сообщение #3


Участник
***

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 30 2014, 08:55
Сообщение #4


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

Группа: Участник
Сообщений: 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.

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

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

ааа... понял в чем тут дело . спасибо.

Сообщение отредактировал Jenya7 - Dec 30 2014, 09:03
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 30 2014, 11:38
Сообщение #5


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Код
if !(counter % 100) PulseOut();

тут есть проблема.
если счетчик обновляется медленно то это условие присутствует какое то время и я получу несколько пульсов вместо одного.
Go to the top of the page
 
+Quote Post
gerber
сообщение Dec 30 2014, 15:14
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 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();
}

biggrin.gif


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 30 2014, 15:44
Сообщение #7


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

biggrin.gif


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

Go to the top of the page
 
+Quote Post
gerber
сообщение Dec 30 2014, 18:04
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



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

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

biggrin.gif


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 31 2014, 01:28
Сообщение #9


;
******

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



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

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

где вы видели проц в котором посчитать модуль дешевле чем сравнить?
вот так говнокод и получается.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 31 2014, 07:37
Сообщение #10


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

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

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

у нас с ae_ была дискусия о другом топике. надо было отследить изменение третьей цифры справа. скажем было 000199 стало 000200. отсюда модули и прочие навороты.
Go to the top of the page
 
+Quote Post
WitFed
сообщение Dec 31 2014, 08:30
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 271
Регистрация: 6-12-11
Из: Taganrog
Пользователь №: 68 701



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

Пахан, не гони -- тут прозрачно обсуждался принцип, хотя мне не нравятся условия типа "if !(counter % 100) ...", а компилятору тем более.
Какой народ двинул во программеры -- такой и [г]кодит, наушники с бурдой не снимая и портя кармы о 9D...
В реальной обстановке можно counter наращивать и сравнивать с верхним пределом 100, и по достижении обнулять.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 31 2014, 14:32
Сообщение #12


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(WitFed @ Dec 31 2014, 14:30) *
.
Какой народ двинул во программеры -- такой и [г]кодит, наушники с бурдой не снимая и портя кармы о 9D...

Gotan Project это не бурда. это самое то для програмера.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 31 2014, 16:36
Сообщение #13


;
******

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



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

Там это относится к преобразованию Bin -> BCD - это не вызывает смущения, ибо доказано, что модулями и делениями эффективнее всего выходит,
а в обсуждаемом примере - таймер wacko.gif или счетчик wacko.gif
Ну тогда конечно, если это сфероконь без предупреждения sm.gif - не смею вмешиваться.

Сообщение отредактировал _Pasha - Dec 31 2014, 16:37
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 31 2014, 16:51
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



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


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

Раньше вроде было доказано, что эффективнее (в случае, если у процессора нет аппаратной поддержки деления) всего алгоритм, который по очереди в цикле вычитает сначала по 10000, потом по 1000, потом по 100, ну и т.д., считая каждый раз, сколько было вычитаний на каждом этапе. Так как, деление (в его двоичном исполнении в стандартной либе) всегда имеет столько итераций вычитания, сколько разрядность числа, для каждой цифры (допустим, 16), а в данном случае - делении сразу в десятичном исполнении - на каждую цифру уходит от 1 до 10 итераций вычитания, что по любому меньше. А объем кода, в пересчете на его размер в машинных кодах, плюс-минус копейки, одинаков.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 31 2014, 18:18
Сообщение #15


;
******

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



Цитата(SM @ Dec 31 2014, 20:51) *
А интересно, где и кем доказано?
А объем кода, в пересчете на его размер в машинных кодах, плюс-минус копейки, одинаков.

Да, и плюс тому деление и остаток могут использоваться еще где-то, а вычитание 10 100 1000- вряд ли.

Сообщение отредактировал _Pasha - Dec 31 2014, 18:19
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 22:01
Рейтинг@Mail.ru


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