Ошибки, баги, вопросы - страница 3518

 
Andrei Iakovlev #:
Есть способ объявлять переменные только 1 раз внутри цикла for, чтобы при повторном выполнении цикла они не объявлялись заново?

static

 
Andrei Iakovlev #:
Есть способ объявлять переменные только 1 раз внутри цикла for, чтобы при повторном выполнении цикла они не объявлялись заново?

как вариант: объекты объявить снаружи цикла, чтобы избегать лишних constructor/destructor? то есть на уровень выше цикла где используются

статики и глобалки - зло.

А объявления скаляров внутри циклов могут оптимизироваться компилятором. Если ему потребуется

То есть образно из "while(cond) { int i = 1; code follows }" компилятор может сотворить "int i ; while(cond) { i=1; code follows }" и самому этим  заниматься - только вредить компилятору, себе и программе.

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

 
Artyom Trishkin #:

static

Про static я забыл, потому что мне не совсем так хочется. For будет в любом случае, и внутри него 1 условие, которое может выполняться, а может не выполняться, и только в том случае, если оно выполняется, я бы хотел объявить переменные только 1 раз.

Может быть есть какой-нибудь интересный способ так сделать?

 
Andrei Iakovlev #:

Про static я забыл, потому что мне не совсем так хочется. For будет в любом случае, и внутри него 1 условие, которое может выполняться, а может не выполняться, и только в том случае, если оно выполняется, я бы хотел объявить переменные только 1 раз.

Может быть есть какой-нибудь интересный способ так сделать?

Существует ещё цикл с помощью рекурсивной функции
Вот пример:
Сейчас , думаю, такой вариант не будет давать такой выигрыш в производительности 
Индикаторы: MaFromMa - Попробуйте сравнить быстродействие рекурсии и итерации.
Индикаторы: MaFromMa - Попробуйте сравнить быстродействие рекурсии и итерации.
  • 2019.04.04
  • Nikolai Semko
  • www.mql5.com
что рекурсия побыстрее работает более чем в два раза. Представленная рекурсия вырождается в цикл, который очень похож на сравниваемый. что линковщик из рекурсии формирует цикл и в такой форме рекурсивной функции переполнения стека можно не бояться. почему при локальных переменных рекурсия стала работать медленнее
 

Nikolai Semko #:
Существует ещё цикл с помощью рекурсивной функции

Очень интересно, спасибо, и я вспомнил, что уже видел это: https://www.mql5.com/ru/forum/1111/page3361#comment_48242594

А здесь пример применения: https://www.mql5.com/ru/code/25414

 
все таки iBarShift глючит.
При наличии баров, выдает -1 в самом начале инициализации. 
Не мог понять причину неправильного поведения, но нашел. Спасает замена альтернативным решением.
 
Nikolai Semko #:
все таки iBarShift глючит.
При наличии баров, выдает -1 в самом начале инициализации
Не мог понять причину неправильного поведения, но нашел. Спасает замена альтернативным решением.

Может, данные ещё не полностью подкачаны?

 
Artyom Trishkin #:

Может, данные ещё не полностью подкачаны?

Данные могут быть полностью закачаны, но если какой то таймфрейм открыт впервые, то  iBarShift по любому вернёт -1 на первом вызове.

Пока не построятся бары нужного таймфрейма  iBarShift будет возвращать -1

 
Nikolai Semko #:
все таки iBarShift глючит.
При наличии баров, выдает -1 в самом начале инициализации. 
Не мог понять причину неправильного поведения, но нашел. Спасает замена альтернативным решением.

Альтернативное решение работает с минутными барами ?

 
Aleksandr Slavskii #:

Альтернативное решение работает с минутными барами ?

https://www.mql5.com/ru/forum/1111/page3277#comment_44527232

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