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

 
Alexey Volchanskiy:

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

Текст формируется ДО отправки его в функцию _Print
 

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

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

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

 
George Merts:

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

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

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

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

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

#define PRINT_ENABLE
#ifdef PRINT_ENABLE 
    #define PRINT(a0, a1, a2, a3, a4, a5, a6, a7) Print(a0, a1, a2, a3, a4, a5, a6, a7);
#else
    #define PRINT(a0, a1, a2, a3, a4, a5, a6, a7)
#endif

void OnStart()
{
    PRINT("Symbol ", Symbol(),  "  Ask=", DoubleToString(Ask, _Digits), "  Bid=", DoubleToString(Bid, _Digits), "", "")
}
 
Andrei Fandeev:
Текст формируется ДО отправки его в функцию _Print
Спасибо, Кэп )) Проблема формирования строки осталась или нет?
 
Alexey Volchanskiy:
Спасибо, Кэп )) Проблема формирования строки осталась или нет?

ОК. Разбираем ситуацию.

ТопикСтартер имеет код, в котором есть строки для печати какого-либо сообщения в Журнал

Т.е. эти строки сообщений УЖЕ сформированы в местах кода где это требуется сделать.

Наша дополнительная функция всего-лишь позволяет НЕ печатать в зависимости от выставленного флага.

Задача ведь была такая? Печатать/НеПечатать.

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

 
Alexey Volchanskiy:

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

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

Не, у меня не так.

Сперва в зависимости от дефайна происходит либо подключение  DebugIncludes.mqh, либо ReleaseIncludes.mqh.

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

Для релиз версии - все просто, там определения типа:

#define TRACE_DOUBLE5(strName,dValue) {};

А для дебаг:

#define TRACE_DOUBLE5(strName,dValue) PerformTrace2(strName,_EDoubleToString(dValue,5),__FUNCSIG__,__LINE__,_GetMagic());

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

 
Andrei Fandeev:

ОК. Разбираем ситуацию.

ТопикСтартер имеет код, в котором есть строки для печати какого-либо сообщения в Журнал

Т.е. эти строки сообщений УЖЕ сформированы в местах кода где это требуется сделать.

Наша дополнительная функция всего-лишь позволяет

НЕ печатать в зависимости от выставленного флага.

Задача ведь была такая? Печатать/НеПечатать.

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

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

Задача в том, чтобы как-то отключать оператор Print, желательно средствами компилятора (это уже мое дополнение). Или сделать полноценную замену оператору Print, с его возможностями преобразования любого типа в строку, тогда легко вставить возможность разрешения/запрета печати. Рассмотрим 3 варианта, легкий, сложный и нереальный

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

#define PRINT_ENABLE // для запрета печати комментируем этот дефайн
#ifdef PRINT_ENABLE 
    #define PRINT(str) Print(str);
#else
    #define PRINT(str)
#endi

 2. Сложный. Можно также сделать на основе условной компиляции, но только с 8-ю аргументами, см. https://www.mql5.com/ru/forum/67363/page2#comment_2058876

3. Сложный и увы, нереальный. Сделать функцию - аналог Print. Затык в одном - в MQL4-5 невозможно передать аргумент без указания типа и потом в функции определить его тип. В некоторых языках это возможно. Например, в C# можно написать так

System.Type type = typeof(int);

Вот раздел справки, кому интересно https://msdn.microsoft.com/en-us/library/58918ffs.aspx 

Нужна ли функция по запрету печати сообщений в журнал эксперта?
Нужна ли функция по запрету печати сообщений в журнал эксперта?
  • www.mql5.com
Нужна ли функция по запрету печати сообщений в журнал эксперта? - Страница 2 - Категория: общее обсуждение
 
George Merts:

Не, у меня не так.

Сперва в зависимости от дефайна происходит либо подключение  DebugIncludes.mqh, либо ReleaseIncludes.mqh.

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

Для релиз версии - все просто, там определения типа:

#define TRACE_DOUBLE5(strName,dValue) {};

А для дебаг:

#define TRACE_DOUBLE5(strName,dValue) PerformTrace2(strName,_EDoubleToString(dValue,5),__FUNCSIG__,__LINE__,_GetMagic());

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

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

Кстати, необязательно ставить {}; в этой строке  

#define TRACE_DOUBLE5(strName,dValue) {};
 
Alexey Volchanskiy:
---Перечитал начало ветки, нигде не сказано, что надо печатать заранее подготовленные СТРОКИ сообщений. Если я пропустил это, приведите текст плз.  

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

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

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

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

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

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

 
Alexey Volchanskiy:

Но вопрос так и остался - в вашем случае можно вывести только строку с заранее определенными параметрами. А написать аналог полноценного Print средствами MQL невозможно.

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

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

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

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