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

 
-Aleks-:
Хорошее решение, спасибо за идею, но минус в том, что нельзя идентифицировать принты, которые нужны только для отладки. Вот если бы замена была возможна по двум строкам...
В отладочном принте первым параметром "1". Получится что-то типа "Print(1". Вот эту строку и меняйте "//Print(1"
 
Alexandr Bryzgalov:
В отладочном принте первым параметром "1". Получится что-то типа "Print(1". Вот эту строку и меняйте "//Print(1"
То ж вариант, но комментировать тело самописной функцию будет изящней :)
 
Dennis Kirichenko:

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

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

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

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

А я вот так и не понял, как пользовать #define, понял что там есть ряд ограничений - по количеству переменных.

Про статью - конечно это интересно - но разрастается фактически код, что в моём случае меня и так напрягает...

И не совсем понял, как решить проблему самоопределения типа переменной при передачи в Print - в статье не обнаружил такой информации... 

 
-Aleks-:

А я вот так и не понял, как пользовать #define, понял что там есть ряд ограничений - по количеству переменных.

Про статью - конечно это интересно - но разрастается фактически код, что в моём случае меня и так напрягает...

И не совсем понял, как решить проблему самоопределения типа переменной при передачи в Print - в статье не обнаружил такой информации... 

#define работает на этапе компиляции, а предложенный мною вариант - в рантайме. Если задача большая - много нужно писать в журнал, то ещё не факт, что мой вариант будет больше по числу строк. ООП как раз и призван бороться с неструктурированным кодом.
 

хех, вопрос конечно интересный, и кстати чем вам не решение

#define DEBUG_MODE
...
#ifdef DEBUG_MODE
   #define D_(A) Print(StringFormat("Debug: %s(), line %d: ", __FUNCTION__, __LINE__), A);
#else 
   #define D_(A)
#endif

 в тексте программы пишем так наши принты

D_(StringFormat("%s и %d сидели на трубе...", Symbol(), Period()))

 и на выходе получаем

 2015.11.20 23:26:43.547 ... EURUSD,M1: Debug: init(), line 96: EURUSD и 1 сидели на трубе...

в релизе комментируем 

//#define DEBUG_MODE

 и с этого момента никаких принтов, в конечном коде уже нет ;)

 
Alexandr Bryzgalov:

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

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

А эта фраза была не вам адресована, а вот кому

Andrei Fandeev:

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

 
Alexandr Bryzgalov:

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

Alexey Volchanskiy :

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

Саня, Алексей видимо не хочет признать, что если есть Принты в коде, то обязательно Текст сообщения ТопикСтартер уже сформировал. Иначе что бы он принтил в Журнал? Неважно перед Принтом или в ().

А твоё решение (и моё в первом сообщении), на мой взгляд, самое оптимальное. Пользователь сам решает печатать в Журнал или нет, выставляя флаг. Без заморочек с перекомпиляцией и закомментированием.

 
Andrey Ziablytsev:

хех, вопрос конечно интересный, и кстати чем вам не решение

 в тексте программы пишем так наши принты

 и на выходе получаем

 2015.11.20 23:26:43.547 ... EURUSD,M1: Debug: init(), line 96: EURUSD и 1 сидели на трубе...

в релизе комментируем 

 и с этого момента никаких принтов, в конечном коде уже нет ;)

Так я и не говорю, что это не решение, а говорю, что это не понятное мне решение :)

В частности мне не ясна структура 

#define D_(A) Print(StringFormat("Debug: %s(), line %d: ", __FUNCTION__, __LINE__), A);

 я правильно понимаю, что можно просто написать

#define D_(A) Print(StringFormat(A);

 

и не могу понять, в хелпе написано:

Директива #define подставляет expression вместо всех последующих найденных вхождений identifier в исходном тексте.

 Вместо - значит заменяет А на строку

StringFormat("%s и %d сидели на трубе...", Symbol(), Period())

 

 и получается для компилятора

 Print(StringFormat("Debug: %s(), line %d: ", __FUNCTION__, __LINE__), StringFormat("%s и %d сидели на трубе..."Symbol(), Period()));

или я неверно интерпретирую хелп?
 
Andrei Fandeev:

Alexey Volchanskiy :

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

Саня, Алексей видимо не хочет признать, что если есть Принты в коде, то обязательно Текст сообщения ТопикСтартер уже сформировал. Иначе что бы он принтил в Журнал? Неважно перед Принтом или в ().

А твоё решение (и моё в первом сообщении), на мой взгляд, самое оптимальное. Пользователь сам решает печатать в Журнал или нет, выставляя флаг. Без заморочек с перекомпиляцией и закомментированием.

нее, условная компиляция лучше(с точки зрения скорости обработки).
 
Alexandr Bryzgalov:
нее, условная компиляция лучше(с точки зрения скорости обработки).
+ уменьшение размера кода, хотя эти сэкономленные килобайты - мелочи. И повторюсь еще раз -  пользователю дебажные принты не нужны, нет смысла оставлять их включение/выключение в настройках. Американцы вас просто не поймут, когда увидят в настройках какие-то дебаги )) У них идеальный робот - робот без настроек ))