Многократное повторение одинаковых фрагментов кода внутри функции - страница 3

 
Alexander Belkin:

#include  КОПИРУЕТ содержимое файла как текст))) Это равносильно тому что вы скопируете текст из файла который описан в #include  непосредственно в код.


Соответственно если кусок кода скопировать (что одно и тоже что описать его в #include) конечно код который в файле будет видеть и локальные и глобальные переменные точно также как его бы видел тотже кусок кода который был бы на месте #include "kusok.h"

Ну раз так, то этот вариант тоже попробую. Спасибо!
 
Alexander Belkin:

@Mihail Matkovskij  так если у вас один и тотже кусок кода)))  всего один файл и нужен.

А в том месте где хотите ВСТАВИТЬ СОДЕРЖИМОЕ кода который описан в файле kusok.h пишите в коде советника/индикатора/скрипта #include "kusok.h" 

Вы бы перед тем как советовать, сами пробовали то, что предлагаете.

Так не будет работать. Все #include кроме первого будут проигнорированы.

 
Andrey Barinov:

Вы бы перед тем как советовать, сами пробовали то, что предлагаете.

Так не будет работать. Все #include кроме первого будут проигнорированы.

А я то думаю, почему  не работает :)

Решил запихать повторяющиеся куски кода в функции. Но тут возникла трудность с переменными. Все их пришлось дублировать в параметрах, чтобы передать по адресам. Плюс, процесс добавления в стек и вытаскивание из стека переменных обратно, думаю, что это не лучшим образом скажется на быстродействии кода. В общем получается сложно, не смотря на выполнимость.

Еще один вариант, запихать локальные переменные и функции в класс, как я уже говорил:

int var = 10;

void func_1(){
  class CLocalFunc{
    public:
      int a, b, c;
      CLocalFunc(){
        a = 1; 
        b = 2; 
        c = 3;
      }
      void lc_f_1(){
        c -= b;
      }
      void lc_f_2(){
        c -= a;
      }
      void lc_f_3(){
        c = (a+b+c)*var;
      }
  };
  
  CLocalFunc Local;
  Local.lc_f_1();
  Local.lc_f_2();
  Print("Local.c: ", Local.c);
  Local.lc_f_3();
  Print("Local.c: ", Local.c);
}

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

И еще один вариант, сделать все переменные глобальными, что само по себе не есть гут, потому как существуют еще параметры вызывающей функции, которые и останутся локальными, как не крути.

В общем, все 3 варианта - взрыв мозга :)

 
Mihail Matkovskij:
Возможно, у кого-то возникала такая проблема, когда один и от же фрагмент кода нужно копировать много раз в различные места функции. Но если одинаковых фрагментов становится слишком много, то становится очень сложно за ними уследить. Делаем изменение в одном фрагменте и тут же, надо искать все идентичные фрагменты и делать там это же изменение много раз. Конечно, можно воспользоваться автозаменой текста. Но всё же, есть способ на много эффективнее, заключить повторяющийся фрагмент в функцию и всталять её сколько угодно раз, там где это необходимо. Но проблема кроется здесь вот в чём. Во первых, вызываемая функция не видит локальных переменных вызывающей её функции. Во вторых, указатели на объекты в параметрах работают только для чтения, но не для записи (следовательно, нельзя передать объекты из вызываемой функцию посредством параметров). По данной проблеме у меня даже есть тема с примером: https://www.mql5.com/ru/forum/227475 . Таким образом, если локальные переменные передать через параметры по адресу, то объекты передать не получится. Кто как выходит из подобных ситуаций, с многократным повторением одних и тех же фрагментов кода?

Ответ здесь может быть один: учитесь программировать. Очевидно, что Вы вначале городите огород, размазывая зависимости в виде локальных или того хуже глобальных переменных, создаете развесистый граф замыканий, а затем пытаетесь героически их решить. Но если все ваши функции чистые, то никаких проблем здесь быть не может, без всяких "а вот если..."

Удачи:)

 
Vasiliy Sokolov:

Ответ здесь может быть один: учитесь программировать. Очевидно, что Вы вначале городите огород, размазывая зависимости в виде локальных или того хуже глобальных переменных, создаете развесистый граф замыканий, а затем пытаетесь героически их решить. Но если все ваши функции чистые, то никаких проблем здесь быть не может, без всяких "а вот если..."

Удачи:)

Ах вон оно что :) Нужно, оказывается, учиться программировать, тогда локальные функции появятся в C++ :)

Да все прогеры, работающие с C++, не говоря уже о чистых MQL-щиках, не могут найти решение этой проблемы! Как всё же сделать локальные функции или организовать многократное обращение к локальным кускам кода, не меняя его по сто раз подряд в различных местах. Например, в Делфи и Объект Паскале такая возможность есть. В любой подпрограмме можно сделать сколько угодно локальных подпрограмм и вставлять из куда угодно, как говорится, сколько душе угодно. Но в C++ такой возможности нет.

Так что, Ваше "учитесь программировать" никак не приближает тему к правильному ответу! ;)

 
Mihail Matkovskij:

Ах вон оно что :) Нужно, оказывается, учиться программировать :)

Да все прогеры, работающие с C++, не говоря уже о чистых MQL-щиках, не могут найти решение этой проблемы....

Все - это кто конкретно? Опять обобщаете без всякой конкретики.

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

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Многократное повторение одинаковых фрагментов кода внутри функции

Комбинатор, 2018.02.18 13:46

) это не пример, это ваша извращенная попытка решить какую-то проблему. проблемы в коде нет, а я прошу объяснить именно проблему, а не то как вы ее пытаетесь решить. Если есть многократное повторение, то покажите его, не на словах а в коде. сделайте пример хотя бы условно небесполезным.

Ваш код отлично преобразуется к виду

void func_1(){}

Кстати, за все время обсуждения, Вы так и не привели реальный пример, где бы эта проблема проявлялась. Одни какие-то c -= a; c -= b; и прочую муру. 

 
Vasiliy Sokolov:

Все - это кто конкретно? Опять обобщаете без всякой конкретики.

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


Кстати, за все время обсуждения, Вы так и не привели реальный пример, где бы эта проблема проявлялась. Одни какие-то c -= a; c -= b; и прочую муру. 

Ну, во первых, почему, все программисты не могут найти решение. Да потому, что его нет. Нет локальных функций в C++. Странно, что Вы не понимаете таких простых вещей.

Да. Я изначально неправильно начал писать свой код, потому как не рассчитывал, что фрагменты будут повторяться так часто. И никакой проблемы мышления здесь нет. Проблема в том, что я не хочу переделывать код.

На счёт исходника, я не могу опубликовать его на всеобщее обозрение, поэтому и привел упрощенный пример.

 
Mihail Matkovskij:

Ну, во первых, почему, все программисты не могут найти решение. Да потому, что его нет. Нет локальных функций в C++. Странно, что Вы не понимаете таких простых вещей.

Да. Я изначально неправильно начал писать свой код, потому как не рассчитывал, что фрагменты будут повторяться. И никакой проблемы мышления здесь нет. Проблема в том, что я не хочу переделывать код.

На счёт исходника, я не могу опубликовать его на всеобщее обозрение, поэтому и привел упрощенный пример.

Исходники нам Ваши здесь не нужны, а нужен вменяемый и законченный пример того, как многократно используются одни и те же куски кода.

 
Vasiliy Sokolov:

Исходники нам Ваши здесь не нужны, а нужен вменяемый и законченный пример того, как многократно используются одни и те же куски кода.

Вы знаете, что такое локальные подпрограммы в Объект Паскале? Так вот, данная тема, это попытка реализовать подобное в MQL. Вышеперечисленные способы, которые предлагались коллегами, а также мной не очень подходят. В данном посте https://www.mql5.com/ru/forum/227865/page3#comment_6600605 находятся не решения, а что-то приближенное, с чем работать было бы очень неудобно. Таким образом, полного аналога объект паскалевских локальных подпрограмм нет.
 
Mihail Matkovskij:
Вы знаете, что такое локальные подпрограммы в Объект Паскале? Так вот, данная тема, это попытка реализовать подобное в MQL. Вышеперечисленные способы, которые предлагались коллегами, а также мной не очень подходят. В данном посте https://www.mql5.com/ru/forum/227865/page3#comment_6600605 находятся не решения, а что-то приближенное, с чем работать было бы очень неудобно. Таким образом, аналога объект паскалевских локальных подпрограмм нет.

Дорогой, вам выше многие дали советы, но вы не слушаетесь. На MQL5 всё можно делать.

Вы сами создали какую-то кашу и не можете ее съесть.  Напишите код без применения класса, и покажите что тут у вас всё время повторяется. 

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