вопрос к знатокам #define - страница 2

 
Ну офигеть, уже и мальчики без прокладок жить не могут.
 
Nikolai Karetnikov:

Спасибо! )

По существу.

На варианте с классом я и остановился. Даже такие элементарные вещи, как параметризация #define без ежедневного употребления быстро забываются. 

По нервам.

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

Спили мушку, крошка.

 
Vladimir Simakov:

А че сразу это решение человеку не показал?)))

UPD: bezgovna - пишется no sh..t )))

Ну тебя же тешит мысль, что я этого не знал. Вот и продолжай биться в оргазме собственной офигительности.

 
Dmitry Fedoseev:
Ну офигеть, уже и мальчики без прокладок жить не могут.

Насчет прокладок.

Чем хорош singleton? Тем, что можно хранить состояние, обрабатывать логи по сложной логике, и т.п., при этом в основном коде все лаконично. Таким образом, создается правильная архитектура проекта, а сам код становится более читабельным.

PS. А так, да, все на любителя. Многим, здесь, в сообществе, и спагетти код с венгерской нотацией мил и близок, да и мазохизм с перебором всех ордеров и позиций (вообще всех) на каждом тике - процветает)

 

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

но там делали немного по другому. Там дефанили имя функции и дописывали туда всякие макрос линии названия функции и прочее... и потом на лету можно было поменять обработчик 

чето в стиле "#defin PRINT подготовка; Print"

ну и сам принт в стиле

void Print (string a;  string a1="";   string a2="";...... // 64 раза. жаль нельзя просто написать  ...a[]

{

Print (Наша подготовка, аргументы);

}

Можно было работать с дефайном как с обычным принтом, а меняя обработчик можно хоть в файл записывать данные хоть на экран выводить. При этом количество аргументов любое (до 64 штук) // это для тех кто не вкурсе

Кстати это как раз отчасти то что автор спрашивал))

 
Dmitry Fedoseev:
Но, к сожалению, на лохов впечатления не произведешь.

А хочется? 

Извини, но как я помню с тех времён, когда ещё использовали (извиняюсь - юзали) Ассемблер, макрорасширение( макрос ) - инструмент, позволяющий заменять его определение на его код непосредственно перед компиляцией. 

Просто, на Ассемблере программировать довольно геморройно и подпрограмм там нет. 

На MQL программировать маненько комфортнее. 

Вопрос: Тебе комфортнее написать подпрограмму, или просто команду Print("No sheet"); либо что-нибудь предопределить в препроцессоре? 

 
Алексей Тарабанов:

(1) А хочется? 

Извини, но как я помню с тех времён, когда ещё использовали (извиняюсь - юзали) Ассемблер, макрорасширение( макрос ) - инструмент, позволяющий заменять его определение на его код непосредственно перед компиляцией. 

(2) Просто, на Ассемблере программировать довольно геморройно и подпрограмм там нет. 

На MQL программировать маненько комфортнее. 

(3) Вопрос: Тебе комфортнее написать подпрограмму, или просто команду Print("No sheet"); либо что-нибудь предопределить в препроцессоре? 

1) Вопрос не ко мне.

2) Подпрограммы в ассемблере есть.

3) Мне комфортнее не страдать херней по вопросам, которые и тухлого яйца не стоят.

 
Alexandr Andreev:

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

но там делали немного по другому. Там дефанили имя функции и дописывали туда всякие макрос линии названия функции и прочее... и потом на лету можно было поменять обработчик 

чето в стиле "#defin PRINT подготовка; Print"

ну и сам принт в стиле

void Print (string a;  string a1="";   string a2="";...... // 64 раза. жаль нельзя просто написать  ...a[]

{

Print (Наша подготовка, аргументы);

}

Можно было работать с дефайном как с обычным принтом, а меняя обработчик можно хоть в файл записывать данные хоть на экран выводить. При этом количество аргументов любое (до 64 штук) // это для тех кто не вкурсе

Кстати это как раз отчасти то что автор спрашивал))

string aN="" и 63 раза - это люто.

Поясняю:

  1. string - это объект, являющийся оберткой над wchar_t*.
  2. Делая string="" 63 раза, ты делаешь следующее: выделяется память под 63 объекта string (в данном случае на стеке), вызывается параметрический конструктор (63 раза), выделяется в куче (именно там) буфер wchar_t* некоторого размера, первые два байта которого инициализируются  0х0000 (да, это тоже 63 раза происходит).

Если уж делаете в таком стиле, то делайте string=NULL, в этом случае, основные затраты по выделению никому не нужной памяти в куче, вы уберете.

UPD. Нет, не прав я, если по уму все сделано, то выделения памяти в куче не будет.

 
Vladimir Simakov:

string aN="" и 63 раза - это люто.

Поясняю:

  1. string - это объект, являющийся оберткой над wchar_t*.
  2. Делая string="" 63 раза, ты делаешь следующее: выделяется память под 63 объекта string (в данном случае на стеке), вызывается параметрический конструктор (63 раза), выделяется в куче (именно там) буфер wchar_t* некоторого размера, первые два байта которого инициализируются  0х0000 (да, это тоже 63 раза происходит).

Если уж делаете в таком стиле, то делайте string=NULL, в этом случае, основные затраты по выделению никому не нужной памяти в куче, вы уберете.

UPD. Нет, не прав я, если по уму все сделано, то выделения памяти в куче не будет.

Вот ты очередной раз не вкурил о чем разговор. Александр пишет про замену Print() через define (чтобы не ползать по всему файлу и не искать все принты). Проблема этого в том, что у Print может быть несколько параметров, хотя их никто и не отличает как параметры - просто строка соединенная запятыми. Так вот, чтобы обеспечить замену стандартной функции Print, нужна функция, принимающая 64 необязательных параметра (чтобы полностью соответствовать функции Print()). А нужно это, чтобы добавить какие-то данные перед логом, может полосочку со стрелочкой (==>) чтобы лучше ее видеть, может номер строки, может дату, может в файл выводить. Скорость работы сего вообще никого не может волновать, потому что делается это в особо сложных случаях поиска ошибок, а потом убирается.

 
string _info;
void _Print(string s,string s1="",string s2="",string s3="",string s4="",string s5="",string s6="",string s7="",string s8="")//.....
   {
   string ss;
   StringConcatenate(ss,s,s1,s2,s3,s4,s5,s6,s7,s8);//....
   //Comment(_info,ss);
   Print(_info,ss);
   }
#define Print _info=__FILE__+" line "+__LINE__ +" "+__FUNCSIG__+" Print: "; _Print

void OnStart()
  {
   
   Templ();
  }
  
void Templ()
   {
   Print("Error, a!=",5," and other....",3,4,5);
   Print("a=",5);
   Print("Hi");
   }


Вроде все понимают.....

Так что это для тех кто только начинает свой путь....

Можно это все еще в стат класс обернуть и возвращать ссылку которой потом приравнивать остатки т.к. у данного способа есть минус при работе с if (a!=5) Print(a);  так работать не будет, нужно обязательно написать  if (a!=5) {Print(a);}, в классах можно этот момент подправить, но лень)) а в обще это вроде все есть в архивах истории

способ с классами инициализиурем наши данные через статичный метод и объединяем оператором вызов нашего принта.... тогда  if (a!=5) Print(a); , будет работать