Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Зависимые логические операции  (Прочитано 8166 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« : 22-05-2014 10:50 » 

Иногда существует необходимость в постоянной "длине" кода, т.е. необходимо проверить все условия. 

пример

if  ( (a+b)>1 or  b==1)

Когда b=f(x)

Как поступит умная система?
Проверит первое условие и пойдет по нужным веткам если  true.

А это делать нельзя...
нужно получать логический результат, и уже "независимый" результат анализировать

т.е

r1 = (a+b)>1
r2 =  (b==1)

res = r1 or r2

if (res)
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dale
Блюзмен
Модератор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 22-05-2014 11:06 » 

Как поступит умная система?
Проверит первое условие и пойдет по нужным веткам если  true.

А это делать нельзя...

Тут в общем-то даже не в "умности" системы дело. Например, стандарт C99 явно определяет "замыкание" логических операций:

Цитата
6.5.13 Logical AND operator
4. Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares equal to 0, the second operand is not evaluated.

Т.е. такая "оптимизация" даже не зависит от доброй воли автора компилятора, а явно навязывается стандартом. Если выполнить вычисление второй части логического выражения, компилятор уже не будет соответствовать стандарту. Во многих других языках примерно то же самое.
Конечно, в C всегда есть лазейка в виде битовой операции &, которая в данном случае даст то же самое, но гарантированно вычислит оба операнда. Но тут уже от языка зависит.
А вообще, как я понял, загвоздка здесь в том, что функция b=f(x) имеет побочные эффекты, и именно поэтому ее необходимо было выполнить 2 раза. Вообще с такими функциями нужно поосторожнее, ибо чревато. Лучше по возможности разделять"чистые" функции без побочных эффектов и процедуры, которые явно меняют среду. Тогда и оптимизировать проще (например, как в нашем случае, когда можно воспользоваться результатом предыдущего вызова и не вычислять функцию повторно при том же аргументе).
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 22-05-2014 11:32 » 

Я уже не помню что там было... то ли чтение портов, то ли запись в порты... Это было все представлено в длинную простынь

Т.е. на этапе проектирования был написан алгоритм проверки, который соответствовал общему смыслу.
А на этапе внедрения - мозг не сломали, но пару-тройку эрэфок  пережигали.
Дело в том, что тогда код писался на бумаге, и анализировался до момента прожига в ПЗУ.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dale
Блюзмен
Модератор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 22-05-2014 11:50 » new

то ли чтение портов, то ли запись в порты...
То есть угадал - функция с побочным эффектом. С такими вообще ухо востро нужно держать, грабли с замыканием логических функций - это еще цветочки.

пару-тройку эрэфок  пережигали.
Для подобных случаев я в ту древнюю эпоху "ультрафиолетовых" РППЗУ соорудил эмулятор на базе статического ОЗУ, в который записывалась программа-кандидат. Вместо ПЗУ в отлаживаемую систему вставлялась колодочка. Этот эмулятор спас массу ПЗУ от преждевременной смерти (ибо, как правило, они поддерживали не более 10 циклов перезаписи), а мой кошелек, соответственно, от чрезмерного опустошения, ибо в финансовом плане эти микросхемы кусались, и пребольно.

В "настоящие" ПЗУ писался уже проверенный код, к которому не было претензий. До этого можно было бесконечно экспериментировать без ощутимых материальных издержек.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 22-05-2014 12:56 » 

там было много нюансов...

один из ... как только плату выносишь на удлинитель, что-то переставало работать. И причина была понятна, но... причина была не наша, а лезть в чужую железку...
Поэтому эмулятор тогда не подходил
Эмулятор сделали чуть позже, для других "ящиков", включили его в договор. Заказчик тогда просто офигел... Эти ящики стал клепать быстрее.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines