Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Знаете ли вы, что в MQL5 появились классы?
o_O
Модератор
23407
o_O 2011.01.22 18:44 

Допустим имеем некий код (функции, классы и т.д.)

Есть интересная задача - создать стек вызовов средствами MQL  Но не просто линейный, а в виде дерева.

Где узлом дерева будет вход в функцию, а ветками - вызовы следующих функций из текущей функции узла.

Например есть такая структура функций

void Main() { A(); B(); }

void A() { /*вошли в А*/ a(); b(); c(); }
void B() { /*Вошли в B*/ a(); b(); c(); }

void a() { /*Вошли в а */ }
void b() { /*Вошли в b */ }
void c() { /*Вошли в c */ }

в результате это будет выглядеть примерно так


Обязательное условие:

В функции имеющегося кода можно добавлять всего лишь одну функцию для организации трейсинга (то есть например только в начале или перед return).
Это условие необходимо для того, что не делать большую модификацию кода, а ограничится лишь вставкой одной и той же функции трейсинга (например назовем её _TRACE_IN_) - во все имеющиеся функции кода.


Буду рад услышать любые идеи или варианты.
Как ни кручу - натыкаюсь на замкнутый круг, что надо вызывать не одну, а две функции для формирования такого дерева. А надо по-любому только одна. :)

Комбинатор
15660
Комбинатор 2011.01.24 12:15  

Если надо не одна а две, выход очевиден -- вместо функции используем экземпляр класса.

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

o_O
Модератор
23407
o_O 2011.01.24 12:27  
TheXpert:

Если надо не одна а две, выход очевиден -- вместо функции используем экземпляр класса.

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

ок. спасибо.

нужна одна - потому как делать модификацию например всей стандартной либы МТ5 нереально. ( если и напрячься, то только порасставлять в начало всех функций одно и тоже).

Ilyas
1186
Ilyas 2011.01.24 13:01  
TheXpert:

Если надо не одна а две, выход очевиден -- вместо функции используем экземпляр класса.

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

А кто мешает сделать так?

class CTraceIn
  {
public:
   void Trace(const string func);   // тут мы добавляем в глобальный объект ноду о вызове и делаем его топовым
   ~CTraceIn();                     // тут мы закрываем ноду о вызове, и топовой становиться предыдущая нода
  };

#define _TRACE_IN_ CTraceIn __X__; __X__.Trace(__FUNCTION__);

Комбинатор
15660
Комбинатор 2011.01.24 15:06  
mql5:
А кто мешает сделать так?
Да, наверное ничего. Чей-то я зациклился на записи одной инструкцией.
o_O
Модератор
23407
o_O 2011.01.24 17:35  
mql5:
А кто мешает сделать так?

то есть грубо говоря - деструктор для экземпляра созданного класса будет вызван при выходе из функции?

во! вот это уже вещь. ДЕСТРУКТОРЫ это СИЛА! :)))

Спасибо!


Vladimir Gomonov
8267
Vladimir Gomonov 2011.01.24 22:21  
mql5:
А кто мешает сделать так?

Хитрый!

:)

Dmitry Fedoseev
41687
Dmitry Fedoseev 2011.01.25 06:28  
Получилось!
Файлы:
t.mq5 1 kb
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий