Logo

Вход

Войти с помощью соц. сетей
Пока нет объявлений.
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения
ТОП СООБЩЕНИЙ
12.02.2018, 19:14
Лучший ответ
Выплачено: 276261 RUB
Сообщение от ir0407 Посмотреть сообщение
Как при помощи break попасть в начало OnTick() из любого места кода?
К примеру, вот:
for(a=1; a<L/2; a++) // Заголовок оператора цикла
{ // Скобка начала тела цикла
bL/2) - a; // Текущее значение сторон
s=a * b; // Текущее значение площади
if (s<=S) // Выбираем большее значение
break; // Выходим за пределы цикла
A=a; // Запоминаем лучшее значение
B=b; // Запоминаем лучшее значение
S=s; // Запоминаем лучшее значение
} // Скобка конца тела циклаНасчёт return, данный оператор очень тяжёлый в плане исполнения, как здесь, так и в Си. Особенно страдает рекурсия, хотя в последнее время сишник доработан в плане x64, а здесь осталось бремя прошлых ошибок.
12.02.2018, 20:15
Лучший ответ
Выплачено: 69915 RUB
Сообщение от ppvic Посмотреть сообщение
К примеру, вот:
for(a=1; a<L/2; a++) // Заголовок оператора цикла
{ // Скобка начала тела цикла
bL/2) - a; // Текущее значение сторон
s=a * b; // Текущее значение площади
if (s<=S) // Выбираем большее значение
break; // Выходим за пределы цикла
A=a; // Запоминаем лучшее значение
B=b; // Запоминаем лучшее значение
S=s; // Запоминаем лучшее значение
} // Скобка конца тела циклаНасчёт return, данный оператор очень тяжёлый в плане исполнения, как здесь, так и в Си. Особенно страдает рекурсия, хотя в последнее время сишник доработан в плане x64, а здесь осталось бремя прошлых ошибок.
Я чёт не всё понял, про запоминаем, после break-а:
A=a; // Запоминаем лучшее значение
B=b; // Запоминаем лучшее значение
S=s; // Запоминаем лучшее значение
И про рекурсию, по подробней.
И причём тут Ха64?
Чёт как-то не ровненько.
12.02.2018, 20:39
Лучший ответ
Выплачено: 182669 RUB
Сообщение от ppvic Посмотреть сообщение
К примеру, вот:
И че? Ну вышли за цикл, а дальше? Пошли отрабатывать, все что есть, пока не вывалимся из OnTick() автоматом? А если нет в коде циклов куда ваш break всовывать?

Сообщение от ppvic Посмотреть сообщение
Насчёт return, данный оператор очень тяжёлый в плане исполнения, как здесь, так и в Си.
Эт с каких таких пор он стал "тяжелым"?
С каких таких пор аппаратная инструкция процессора RET, которая имеет размер всего в один байт, которая не выполняет никаких вычислений и выполняется всего за пару тройку тактов проца максимум, вдруг стала у вас "очень тяжелой в плане исполнения"? И при чем тут вообще Си или любой другой язык?

Сообщение от ppvic Посмотреть сообщение
Особенно страдает рекурсия,
Рекурсия - это вообще отдельная песня с неконтролируемым расходом стека... И к чему она тут?
17.03.2018, 15:15
Лучший ответ
Выплачено: 276261 RUB
Сообщение от ir0407 Посмотреть сообщение
С каких таких пор аппаратная инструкция процессора RET, которая имеет размер всего в один байт, которая не выполняет никаких вычислений и выполняется всего за пару тройку тактов проца максимум, вдруг стала у вас "очень тяжелой в плане исполнения"? И при чем тут вообще Си или любой другой язык?
Запоздало увидел. Рассказываю:

Оператор return, именно в MQL, очень жестоко использует машинные мощности, что иногда критично бывает, если код выполняется на виртуальных выделенных серверах.
В подобных случаях, нарастает использование оперативной памяти терминала, особенно при постоянной рекурсии, что может вызвать отказ слабых VDS. А это не очень хорошо...
В MQL5 данная проблема, кажется, решена, теми же инлайн-функциями (это уже С++ на языке оригинала), но оптимизация оставляет желать лучшего.

Ваше же утверждение:
Сообщение от ir0407 Посмотреть сообщение
аппаратная инструкция процессора RET, которая имеет размер всего в один байт
это смеху подобно, уж извините, дражайщий ir0407.

Далее, всю суть оператора return, как и суть работы функций, можно посмотреть и на MQL4.com, и на пауке, при желании.
17.03.2018, 15:26
Лучший ответ
Выплачено: 276261 RUB
Сообщение от ir0407 Посмотреть сообщение
С каких таких пор аппаратная инструкция процессора RET, которая имеет размер всего в один байт, которая не выполняет никаких вычислений и выполняется всего за пару тройку тактов проца максимум, вдруг стала у вас "очень тяжелой в плане исполнения"?
Ещё вот, уважаемый ir0407:
Именно так выглядит обычно сишный RET на x86 системах:
push ebp mov ebp, esp mov eax, [ebp+8] add eax, [ebp+12] mov esp, ebp pop ebp retТак что смешно Вы пошутили насчет размера в один байт.
Надеюсь, что пошутили.
17.03.2018, 15:46
Лучший ответ
Выплачено: 276261 RUB
Сообщение от ir0407 Посмотреть сообщение
Рекурсия - это вообще отдельная песня с неконтролируемым расходом стека...
На поздних версиях MQL дело не стеке, а в расходе памяти. Вы верно высказались, но Вы не совсем в курсе сути.
Стек, а его нет сейчас вообще, в принципе. При желании, Вы сами сможете всё посмотреть. Было бы желание...
  • #1 Свернуть

    Break

    Сообщение от DRAKON Посмотреть сообщение
    всем привет подскажите пожалуйста помню попадалась где-то такая функция которая останавливает чтение кода и после неё чтение начинается сначала (продолжается) только не с момента инициализации а продолжается сначала кода который читается на каждом тике заранее спасибо
    Сообщение от ir0407 Посмотреть сообщение
    Это самая секретная функция, return называется.
    Ещё break:
    https://docs.mql4.com/basis/operators/break

    The break operator terminates the execution of the nearest nested outward switch, while, do-while or for operator. The control is passed to the operator that follows the terminated one. One of the purposes of this operator is to finish the looping execution when a certain value is assigned to a variable.
  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    Сообщение от ppvic Посмотреть сообщение
    Ещё break:
    Слегка не из той оперы.

    Комментарий

    • #3 Свернуть

      Сообщение от ir0407 Посмотреть сообщение
      Слегка не из той оперы.
      ИМХО, как раз из той.
      Если ретёрнить каждый раз, то здорово может пострадать код в плане исполнения. А вот break даёт возможность уйти без необходимости дополнительных итераций.

      Комментарий

      • #4 Свернуть

        Сообщение от ppvic Посмотреть сообщение
        ИМХО, как раз из той.
        Если ретёрнить каждый раз, то здорово может пострадать код в плане исполнения.
        Стесняюсь спросить... В каком плане, типа "в плане исполнения"? "В плане исполнения" чего?
        Сообщение от ppvic Посмотреть сообщение
        А вот break даёт возможность уйти без необходимости дополнительных итераций.
        На мой взгляд вопрос был поставлен довольно четко:
        Сообщение от DRAKON Посмотреть сообщение
        функция которая останавливает чтение кода ... только не с момента инициализации а продолжается сначала кода который читается на каждом тике
        Тобишь ему нужно прервать выполнение и попасть в начало OnTick(). И посему вопрос... Как при помощи break попасть в начало OnTick() из любого места кода?

        Комментарий

        • #5 Свернуть

          Сообщение от ir0407 Посмотреть сообщение
          Как при помощи break попасть в начало OnTick() из любого места кода?
          К примеру, вот:
          for(a=1; a<L/2; a++) // Заголовок оператора цикла
          { // Скобка начала тела цикла
          bL/2) - a; // Текущее значение сторон
          s=a * b; // Текущее значение площади
          if (s<=S) // Выбираем большее значение
          break; // Выходим за пределы цикла
          A=a; // Запоминаем лучшее значение
          B=b; // Запоминаем лучшее значение
          S=s; // Запоминаем лучшее значение
          } // Скобка конца тела циклаНасчёт return, данный оператор очень тяжёлый в плане исполнения, как здесь, так и в Си. Особенно страдает рекурсия, хотя в последнее время сишник доработан в плане x64, а здесь осталось бремя прошлых ошибок.

          Комментарий

          • #6 Свернуть

            Сообщение от ppvic Посмотреть сообщение
            К примеру, вот:
            for(a=1; a<L/2; a++) // Заголовок оператора цикла
            { // Скобка начала тела цикла
            bL/2) - a; // Текущее значение сторон
            s=a * b; // Текущее значение площади
            if (s<=S) // Выбираем большее значение
            break; // Выходим за пределы цикла
            A=a; // Запоминаем лучшее значение
            B=b; // Запоминаем лучшее значение
            S=s; // Запоминаем лучшее значение
            } // Скобка конца тела циклаНасчёт return, данный оператор очень тяжёлый в плане исполнения, как здесь, так и в Си. Особенно страдает рекурсия, хотя в последнее время сишник доработан в плане x64, а здесь осталось бремя прошлых ошибок.
            Я чёт не всё понял, про запоминаем, после break-а:
            A=a; // Запоминаем лучшее значение
            B=b; // Запоминаем лучшее значение
            S=s; // Запоминаем лучшее значение
            И про рекурсию, по подробней.
            И причём тут Ха64?
            Чёт как-то не ровненько.

            Комментарий

            • #7 Свернуть

              Сообщение от ppvic Посмотреть сообщение
              К примеру, вот:
              И че? Ну вышли за цикл, а дальше? Пошли отрабатывать, все что есть, пока не вывалимся из OnTick() автоматом? А если нет в коде циклов куда ваш break всовывать?

              Сообщение от ppvic Посмотреть сообщение
              Насчёт return, данный оператор очень тяжёлый в плане исполнения, как здесь, так и в Си.
              Эт с каких таких пор он стал "тяжелым"?
              С каких таких пор аппаратная инструкция процессора RET, которая имеет размер всего в один байт, которая не выполняет никаких вычислений и выполняется всего за пару тройку тактов проца максимум, вдруг стала у вас "очень тяжелой в плане исполнения"? И при чем тут вообще Си или любой другой язык?

              Сообщение от ppvic Посмотреть сообщение
              Особенно страдает рекурсия,
              Рекурсия - это вообще отдельная песня с неконтролируемым расходом стека... И к чему она тут?
              Последний раз редактировалось Helios; 13.02.2018, 13:25. Причина: удалено оскорбление

              Комментарий

              • #8 Свернуть

                Сообщение от ir0407 Посмотреть сообщение
                С каких таких пор аппаратная инструкция процессора RET, которая имеет размер всего в один байт, которая не выполняет никаких вычислений и выполняется всего за пару тройку тактов проца максимум, вдруг стала у вас "очень тяжелой в плане исполнения"? И при чем тут вообще Си или любой другой язык?
                Запоздало увидел. Рассказываю:

                Оператор return, именно в MQL, очень жестоко использует машинные мощности, что иногда критично бывает, если код выполняется на виртуальных выделенных серверах.
                В подобных случаях, нарастает использование оперативной памяти терминала, особенно при постоянной рекурсии, что может вызвать отказ слабых VDS. А это не очень хорошо...
                В MQL5 данная проблема, кажется, решена, теми же инлайн-функциями (это уже С++ на языке оригинала), но оптимизация оставляет желать лучшего.

                Ваше же утверждение:
                Сообщение от ir0407 Посмотреть сообщение
                аппаратная инструкция процессора RET, которая имеет размер всего в один байт
                это смеху подобно, уж извините, дражайщий ir0407.

                Далее, всю суть оператора return, как и суть работы функций, можно посмотреть и на MQL4.com, и на пауке, при желании.

                Комментарий

                • #9 Свернуть

                  Сообщение от ir0407 Посмотреть сообщение
                  С каких таких пор аппаратная инструкция процессора RET, которая имеет размер всего в один байт, которая не выполняет никаких вычислений и выполняется всего за пару тройку тактов проца максимум, вдруг стала у вас "очень тяжелой в плане исполнения"?
                  Ещё вот, уважаемый ir0407:
                  Именно так выглядит обычно сишный RET на x86 системах:
                  push ebp mov ebp, esp mov eax, [ebp+8] add eax, [ebp+12] mov esp, ebp pop ebp retТак что смешно Вы пошутили насчет размера в один байт.
                  Надеюсь, что пошутили.

                  Комментарий

                  • #10 Свернуть

                    Сообщение от ir0407 Посмотреть сообщение
                    Рекурсия - это вообще отдельная песня с неконтролируемым расходом стека...
                    На поздних версиях MQL дело не стеке, а в расходе памяти. Вы верно высказались, но Вы не совсем в курсе сути.
                    Стек, а его нет сейчас вообще, в принципе. При желании, Вы сами сможете всё посмотреть. Было бы желание...

                    Комментарий

                    • #11 Свернуть

                      Сообщение от ppvic Посмотреть сообщение
                      Ещё вот, уважаемый ir0407:
                      Именно так выглядит обычно сишный RET на x86 системах:
                      push ebp mov ebp, esp mov eax, [ebp+8] add eax, [ebp+12] mov esp, ebp pop ebp retТак что смешно Вы пошутили насчет размера в один байт.
                      Надеюсь, что пошутили.
                      Не совсем понял:
                      push ebp;
                      mov ebp, esp;
                      mov eax, [ebp+8] ;
                      add eax, [ebp+12] ;
                      mov esp, ebp;
                      pop ebp;
                      ret; <----- Это про это дискуссия?
                      Или про то, что выше, про куда вернуться?
                      Последний раз редактировалось MonyaMaker; 17.03.2018, 16:21.

                      Комментарий

                      • #12 Свернуть

                        Сообщение от MonyaMaker Посмотреть сообщение
                        Не совсем понял:
                        Ну да. Это про оператор return в MQL4.
                        Не лучший выбор остановить цикл или выбор варианта.
                        В идеале будет switch:break, for:break, или while:break
                        https://book.mql4.com/operators/break

                        Комментарий

                        • #13 Свернуть

                          Сообщение от ppvic Посмотреть сообщение
                          Запоздало увидел. Рассказываю:

                          Оператор return, именно в MQL, очень жестоко использует машинные мощности,
                          Слов нет... Одни эмоции...

                          Сообщение от ppvic Посмотреть сообщение
                          Именно так выглядит обычно сишный RET на x86 системах:
                          push ebp mov ebp, esp mov eax, [ebp+8] add eax, [ebp+12] mov esp, ebp pop ebp ret
                          Учите матчасть, уважаемый и не путайте грешное с праведным... Ваш "сишный RET на x86 системах" это только лишь последняя инструкция, а все остальное - это манипуляции компилятора со стеком для обслуживания локальных переменных конкретной функции и/или(в данном конкретном случае) ее параметров. И чтоб вы знали, далеко не все компиляторы и далеко не всегда генерят подобный код. Все зависит от опций конкретного компилятора и его "интеллекта".

                          ЗЫ: Да и лукавите вы, уважаемый, засчитав в "сишный RET" тело самой функции.
                          Код:
                          ;=========> Пролог(генерируется компилятором) 
                          push ebp         ;Сохраняем значение ebp
                          mov ebp, esp         ;Копируем значение вершины стека
                          
                          ;=========> Тело функции
                          mov eax, [ebp+8]     ;Получаем значение первого параметра
                          add eax, [ebp+12]     ;Прибавляем к нему значение второго параметра
                          
                          ;=========> Эпилог(генерируется компилятором)
                          mov esp, ebp         ;Восстанавливаем значение верщины стека
                          pop ebp            ;Восстанавливаем значение ebp
                          
                          ;=========> Выход
                          ret            ;Выход, результат в eax.
                          
                          И этот код аналогичен такому коду на Си.
                          int Func(int Var1, Var2)
                          {
                            return(Var1 + Var2);
                          }
                          Последний раз редактировалось ir0407; 17.03.2018, 17:20.

                          Комментарий

                          • #14 Свернуть

                            Сообщение от ppvic Посмотреть сообщение
                            Ну да. Это про оператор return в MQL4.
                            Не лучший выбор остановить цикл или выбор варианта.
                            В идеале будет switch:break, for:break, или while:break
                            https://book.mql4.com/operators/break
                            Лучший или худший, особо рассуждать не приходиться, а приходится пользоваться тем, что есть, или своё прикручивать.
                            Ну а если не нравиться, API в помощь.
                            Что касается именно return, то в больших системах, ну очень помогает глючное место при очень ветвящейся логике находить, возвращая код завершения работы функции на верхний уровень.

                            Комментарий

                            • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
                            • #15 Свернуть

                              Сообщение от MonyaMaker Посмотреть сообщение
                              Лучший или худший, особо рассуждать не приходиться, а приходится пользоваться тем, что есть,
                              Тут и говорить не о чем. В данном случае вопрос был совершенно не про циклы. И ppvic, от незнания матчасти, просто тупо съехал на "шопопало".

                              Комментарий

                              working...
                              X