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

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

Заверните повторяющийся участок в макрос.

Mihail Matkovskij
6306
Mihail Matkovskij  
Nikolay Demko:

Заверните повторяющийся участок в макрос.

В Метаредакторе вроде нет такого...

Yuriy Asaulenko
9360
Yuriy Asaulenko  
Mihail Matkovskij:

В Метаредакторе вроде нет такого...

Тогда в функцию.)

Mihail Matkovskij
6306
Mihail Matkovskij  
Yuriy Asaulenko:

Тогда в функцию.)

В функцию нельзя по причине вышеизложенного!

Yuriy Asaulenko
9360
Yuriy Asaulenko  
Mihail Matkovskij:

В функцию нельзя по причине вышеизложенного!

В класс. А переменные сделать переменными класса, приват, например.

Кстати, в функции возможно определить вложенную функцию, тогда переменные будут видны. Поодержит ли это MQL? - не знаю, не приходилось.

---
22800
---  
Mihail Matkovskij:

В Метаредакторе вроде нет такого...

есть
Mihail Matkovskij
6306
Mihail Matkovskij  
o_o:
есть

А есть ли конкретные примеры, как это сделать в Метаредакторе? Нашел пример на C++ https://habrahabr.ru/post/149513/, но там только вывод строки на экран. А мне нужна передача данных из функции, включая объекты, которых может быть несколько. И еще один важный момент, будут ли макросы компилироваться в ex5 как включаемые файлы mqh, например?

Mihail Matkovskij
6306
Mihail Matkovskij  

С классами внутри функции выходит следующее:

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

В результате:

'c' - undeclared identifier
'b' - undeclared identifier

Вроде и можно реализовать локальный класс внутри функции, но, к сожалению, он не видит её переменных.

Yuriy Asaulenko
9360
Yuriy Asaulenko  
Mihail Matkovskij:

С классами внутри функции выходит следующее:

В результате:

'c' - undeclared identifier
'b' - undeclared identifier

Вроде и можно реализовать локальный класс внутри функции, но, к сожалению, он не видит её переменных.

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

Про вложенную функцию (она тоже видит все переменные) уже писал.

TheXpert
18270
TheXpert  
Mihail Matkovskij:

Начните с наглядного примера проблемы, если тема не для просто поболтать

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий