Бесконечное зацикливания цикла, как исправить? - страница 5

 
Artem Onopin:

Спасибо всем за помощь! Особенно Andrey Kisselyov

пожалуйста.

с уважением.
 
Vitaly Muzichenko:

Ошибочно.

Условие if начинает проверять условия поочерёдно, и если первое выполнилось, то идёт дальше, если второе не выполнилось - выход и третье уже не проверяет, что экономит время и системные ресурсы.

ошибки нет, приоритет скобок самый высокий, почитайте https://www.mql5.com/ru/docs/basis/operations/rules  все что находиться в скобках, выполняется с высоким приоритетом, а значит должно быть высчитано все, до последнего члена. другое дело что разработчики заложили в данную среду разработки, правило оптимизирующее выполнение логических операций в них.

с уважением.
Документация по MQL5: Основы языка / Операции и выражения / Приоритеты и порядок операций
Документация по MQL5: Основы языка / Операции и выражения / Приоритеты и порядок операций
  • www.mql5.com
Основы языка / Операции и выражения / Приоритеты и порядок операций - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Andrey Kisselyov:
ошибки нет, приоритет скобок самый высокий, почитайте https://www.mql5.com/ru/docs/basis/operations/rules  все что находиться в скобках, выполняется с высоким приоритетом, а значит должно быть высчитано все, до последнего члена. другое дело что разработчики заложили в данную среду разработки, правило оптимизирующее выполнение логических операций в них.

с уважением.

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

Pascal, Delphi    if edit1.Text='' or Edit2.text='' then

VBA If c = "М7" And t = "180" Then

Думаю, принятая в MQL короткая схема логических вычислений в точности совпадает с описанной, например, в паскале, для директивы компилятора $B- http://pascal.net.ru/%24B:

$B: Булева оценка


Переключает между двумя различными моделями генерации объектного кода для булевых операторов AND и OR.

 Синтаксис:             {$B+} или {$B-}
 Значение по умолчанию: {$B-}
 Тип:                   Локальная
 Команда меню:          Options|Compiler|Boolean Evaluation

Состояние $B+

В состоянии $B+, компилятор генерирует код для полной булевой оценки выражения.

Это означает, что каждый операнд булева выражения, созданного при помощи операторов AND и OR, будет оценен, даже в том случае, если результат всего выражения уже известен.

Состояние $B-

В состоянии $B-, компилятор генерирует код с короткой схемой оценки булевого выражения.

Это означает, что оценка выражения прекращается, как только результат всего выражения становится очевидным.

Булевы операторы
Булевы операторы
  • 2010.11.13
  • OCTAGRAM
  • pascal.net.ru
Булевы операторы
 
Vladimir:

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

Pascal, Delphi    if edit1.Text='' or Edit2.text='' then

VBA If c = "М7" And t = "180" Then

Думаю, принятая в MQL короткая схема логических вычислений в точности совпадает с описанной, например, в паскале, для директивы компилятора $B- http://pascal.net.ru/%24B:

$B: Булева оценка


Переключает между двумя различными моделями генерации объектного кода для булевых операторов AND и OR.

 Синтаксис:             {$B+} или {$B-}
 Значение по умолчанию: {$B-}
 Тип:                   Локальная
 Команда меню:          Options|Compiler|Boolean Evaluation

Состояние $B+

В состоянии $B+, компилятор генерирует код для полной булевой оценки выражения.

Это означает, что каждый операнд булева выражения, созданного при помощи операторов AND и OR, будет оценен, даже в том случае, если результат всего выражения уже известен.

Состояние $B-

В состоянии $B-, компилятор генерирует код с короткой схемой оценки булевого выражения.

Это означает, что оценка выражения прекращается, как только результат всего выражения становится очевидным.

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



с уважением.

P.S. если вы прогоните, в приведенном вами языке, мой код и свой с параметром $B+ вы увидите, что ваш код исполняется медленнее моего.
       а вот мой код будет исполнятся как с параметром $B+ так  и с параметром $B- одинаково быстро.
 
Andrey Kisselyov: оптимизация кода происходит на уровне компилятора. хотя вы ее можете указать сами, в коде, как делаю это я, вынося каждую проверку в отдельное условие

Совершенно правильно. Оптимальный код надежнее надежды на компилятор. Однако - разница в загрузке процессора мала. В вот полмесяца назад скачал индикатор и заинтересовался алгоритмом его работы. В результате выбросил 70% кода при том же результате. Хочу этим сказать, что оптимизация алгоритма видимо важнее

 
STARIJ:

Совершенно правильно. Оптимальный код надежнее надежды на компилятор. Однако - разница в загрузке процессора мала. В вот полмесяца назад скачал индикатор и заинтересовался алгоритмом его работы. В результате выбросил 70% кода при том же результате. Хочу этим сказать, что оптимизация алгоритма видимо важнее

ХОРОШИЙ ВЫВОД.
вы  сами должны писать такой код, который на любой машине будет выполняться одинаково быстро и точно. иначе после прогона на каком либо компиляторе, который не соответствует тому что вы использовали раньше, могут появиться проблемы исполнения, которые вам придется исправлять.

с уважением.
 
Andrey Kisselyov:
ошибки нет, приоритет скобок самый высокий, почитайте https://www.mql5.com/ru/docs/basis/operations/rules  все что находиться в скобках, выполняется с высоким приоритетом, а значит должно быть высчитано все, до последнего члена. другое дело что разработчики заложили в данную среду разработки, правило оптимизирующее выполнение логических операций в них.

с уважением.

Мое удивление было вызвано фразой "все что находиться в скобках, выполняется с высоким приоритетом, а значит должно быть высчитано все, до последнего члена". Как ее следует понимать в случае короткой схемы вычисления логических выражений, когда "оценка выражения прекращается, как только результат всего выражения становится очевидным". Что здесь имелось в виду? Для меня это разные вещи. Или высчитывать все до последнего члена, или прекратить вычисления, как только результат стал очевиден...

 
Справочник MQL4: Обновленный MQL4: В логических операциях теперь используется укороченная проверка условия. В старой версии MQL4 вычислялись все выражения, и только потом производилась проверка условия. Следовательно, любая часть логического выражения, в том числе и заключенная в скобки, вычисляется до очевидности.
 
STARIJ:
Справочник MQL4: Обновленный MQL4: В логических операциях теперь используется укороченная проверка условия. В старой версии MQL4 вычислялись все выражения, и только потом производилась проверка условия. Следовательно, любая часть логического выражения, в том числе и заключенная в скобки, вычисляется до очевидности

Давно пора было так сделать.

 
Vladimir:

Мое удивление было вызвано фразой "все что находиться в скобках, выполняется с высоким приоритетом, а значит должно быть высчитано все, до последнего члена". Как ее следует понимать в случае короткой схемы вычисления логических выражений, когда "оценка выражения прекращается, как только результат всего выражения становится очевидным". Что здесь имелось в виду? Для меня это разные вещи. Или высчитывать все до последнего члена, или прекратить вычисления, как только результат стал очевиден...


Должна прекратиться проверка как только условие не выполнилось. Поэтому условие которое часто меняется нужно ставить первым, тем самым повышая общее быстродействие.

Причина обращения: