Нужна ли функция по запрету печати сообщений в журнал эксперта? - страница 3

 
Andrei Fandeev:
---Перечитал начало ветки, нигде не сказано, что надо печатать заранее подготовленные СТРОКИ сообщений. Если я пропустил это, приведите текст плз.  

>>> "При отладке советника приходится ставить много Print'ов" - т.е. сообщения сфоримрованы в коде у ТопикСтартера. Он их печатает в Журнал.

---Задача в том, чтобы как-то отключать оператор Print, желательно средствами компилятора (это уже мое дополнение).

>>> Мы не ищем лёгких путей? )))

---1. Легкий. Строка формируется заранее. Не смысла вставлять в код дополнительные функции _Print, лучше использовать условную компиляцию.

>>> Т.е. для отключения надо лазить в Эдитор??? А пользователю через флаг в настройках не проще?

2 и 3 вообще городушка на ровном месте. Зачем так усложнять?

1. То, что "приходится ставить много Print'ов" не означает, что " т.е. сообщения сфоримрованы в коде у ТопикСтартера. Он их печатает в Журнал.". 

>>> "При отладке советника приходится ставить много Print'ов"

У вас пользователи занимаются отладкой ваших программ? Бедняжки ))

Вы передергиваете факты, на этом прекращаю бессмысленное обсуждение. 

 
Alexey Volchanskiy: на этом прекращаю бессмысленное обсуждение. 
Действительно.
 
Andrei Fandeev:
а return(0);  в void  ?  )))

искать ошибки обязанность компилятора )

покажет поправлю, нет значит всё нормально ))

если скажу что до этого OnTick(в этом примере) был int типа ты наверное в обморок упадёшь )

но это-то я поправил, а вот возврат нуля забыл )

 
Alexey Volchanskiy:
Спасибо, Кэп )) Проблема формирования строки осталась или нет?

не было проблемы формирования строки, была проблема включения принтов во время отладки и отключения для обычной работы.

ведь вот ведь что хотел сделать ТС: "Моё предложение - сделать функции по аналогии с Print и Printf , исполнение которых будут блокироваться с помощью другой функции в коде - допустим Оffрrint."

 
Andrei Fandeev:

Передайте туда только текст

А в функции только проверка НадоПечатать/НеНадоПечатать

В таком случае не придётся затирать IFы по всему телу кода, а только выключить параметр разрешения печати

Alexandr Bryzgalov:
теперь ифы не обязательны, теперь обязательны "_" перед Print )


Такой подход усложняет принт - вот такой код получается, если требуется не только текст, а и значение переменной получить - для чего часто и принтуется код при отладке.

bool USE_PRINT=false;

F_Print("Проверка "+DoubleToString(MAT,4));

void F_Print(string txt)

  {

    if(USE_PRINT==true) Print(txt);

  } 


Да и ifы не убирает, а они могут занять до 1% времени на вычисление, а при оптимизации это выльется в часы. 

Alexey Volchanskiy:

Ну и что? Осталась проблема с формированием строки.

Проголосовал Нет, так как нужна не функция, а дефайн условной компиляции, встроенный в Print на стороне разработчиков MQL. 

 Так сути дела оно не меняет. Такой вариант так же возможен.

 

George Merts:

А чем плоха условная компиляция-то ?

В зависимости от дебаг-дефайнов либо выводим сообщение, либо нет...

У меня в коде очень много макросов типа TRACE_DOUBLE5("Текущая цена: ",dCurPrice), которые разворачиваются либо в форматированный вывод значения в дебаг-версии, либо в пустое место в релиз-версии.

А поподробней можно, как Вы меняете способ вывода, или это опять же ифы но в другой обёртке?

 

Alexey Volchanskiy:

Тогда уж лучше вот так 

К сожалению, MQL4 позволяет задавать только 8 параметров в define, но на безрыбье и рак рыба )) Вместо неиспользуемых параметров дефайна надо что-то вставлять, например пустую строку ""

Чем такой вариант лучше самописной функции, что написана выше?

 

George Merts:

Да, все верно.

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

С другой стороны - у меня есть макросы TRACE_DOUBLE, TRACE_DOUBLE4, TRACE_DOUBLE5 - которые используют различное округление double. Темплейт-классом уже будут сложности - скажем, если есть темплейты для string и double - то придется вещественный тип выводить полностью, без обрезки. А для округлений - пользоваться либо старыми макросами, либо дополнительно указывать величину округления (что, по сути, одно и то же)

По факту значит нет способа сделать самоопределение типа переменой?

 
Alexandr Bryzgalov:

не было проблемы формирования строки, была проблема включения принтов во время отладки и отключения для обычной работы.

ведь вот ведь что хотел сделать ТС: "Моё предложение - сделать функции по аналогии с Print и Printf , исполнение которых будут блокироваться с помощью другой функции в коде - допустим Оffрrint."

Проблемы формирования строки явно не было, до начала обсуждения. Предложенный вариант - вынос в самописную функцию принта создаёт эту проблему.
 

Alexey Volchanskiy , Andrei Fandeev не приятно, когда ссора возникает из-за заданного мной вопроса, к тому же я не понял в чём причина ярой конфронтации. От меня требуются уточнения - готов их дать - только спросите.

Цель в том, что б в идеале не усложняя код и без if'ов отключать выборочно принты, а достижение этой цели может быть разное. 

 
-Aleks-:

Такой подход усложняет принт - вот такой код получается, если требуется не только текст, а и значение переменной получить - для чего часто и принтуется код при отладке.

bool USE_PRINT=false;

F_Print("Проверка "+DoubleToString(MAT,4));

void F_Print(string txt)

  {

    if(USE_PRINT==true) Print(txt);

  } 


Да и ifы не убирает, а они могут занять до 1% времени на вычисление, а при оптимизации это выльется в часы. 


тогда делать отладку и убирать принты если после отладки они не нужны. Поиск и замена в метаэдиторе ищем Print меняем на //Print
 
Alexandr Bryzgalov:
тогда делать отладку и убирать принты если после отладки они не нужны. Поиск и замена в метаэдиторе ищем Print меняем на //Print

Хорошее решение, спасибо за идею, но минус в том, что нельзя идентифицировать принты, которые нужны только для отладки. Вот если бы замена была возможна по двум строкам...

Кстати, можно просто закомментировать тело самописной функции с принтоми это будет не плохим решением! 

 

ПредлОжу свой вариант. Он, скажем так, заходит издалека к поставленной задаче.

Есть статейка "Программируем режимы работы советника с помощью ООП" у одного писателя.

Там есть разные режимы роботов. Для каждого можно написать свой виртуальный метод Print(). Он и будет для каждого режима свой журнал печатать...

А вообще, имхо, если нужно быстро, то лучше юзать #define.

Программируем режимы работы советника с помощью ООП
Программируем режимы работы советника с помощью ООП
  • 2014.12.19
  • Dennis Kirichenko
  • www.mql5.com
В статье рассматривается идея мультирежимного программирования торговых роботов на MQL5. Используется объектно-ориентированный подход для реализации каждого из режимов. Приводится пример иерархии режимных классов и пример классов для тестирования. Предполагается, что мультирежимное программирование торговых роботов полностью учитывает особенности каждого режима работы MQL5-советника. Для идентификации режимов создаются функции и перечисление.