Мой подход. Ядро - Движок. - страница 97

 
Vasiliy Sokolov:

Петр, ну какие к черту строки?! У тебя куча параметров вроде double, int, color ты их конвертируешь в строку что бы записать в объект на графике. Но при работе с union никаких строк не требуется. Посмотри пример еще раз, там ты работаешь с double напрямую, без всяких строк и данные прекрасно передаются.

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

Например, Советник Олега Папкова передает в свои окна тексты, типа "Тренд пошел вверх, Тренд пошел вниз...". Другие захотят передавать тексты в ячейки таблиц. В поля ввода.

Никак не обойтись только числами... ((

 

Если тебе нужно передать именно текст, тогда строку переводишь в массив байтов:

StringToCharArray("text", u.char);

где u - union а u.char массив char[] соответственно. У union массив будет фиксированного размера, поэтому если строка не влезает то либо увеличиваешь u.char, либо передаешь строку по частям.

 
Vasiliy Sokolov:

Если тебе нужно передать именно текст, тогда строку переводишь в массив байтов:

где u - union а u.char массив char[] соответственно. У union массив будет фиксированного размера, поэтому если строка не влезает то либо увеличиваешь u.char, либо передаешь строку по частям.

Ясно. Спасибо. Буду пробывать. (Хотя, можно было бы просто через описание объектов все сделать), но я хочу разобратся до конца с ресурсами. Может тоже пригодится.

Дополнительные возможности всегда полезны. Да и знания новые не помешают...

Короче, огромное спасибо за помощь тебе лично и всем остальным.

 
Реter Konow:

Ясно. Спасибо. Буду пробывать. (Хотя, можно было бы просто через описание объектов все сделать), но я хочу разобратся до конца с ресурсами. Может тоже пригодится.

Дополнительные возможности всегда полезны. Да и знания новые не помешают...

Короче, огромное спасибо за помощь тебе лично и всем остальным.

Если хочешь быструю связь - ничего быстрее union не сделаешь. Строку с параметрами ты действительно передаш через объекты очень быстро, может быть даже быстрее чем через ResourceCreate, НО на парсинге этой самой строки у тебя убъется вся скорость. Правда MQL очень быстрый язык, и даже медленный парсинг здесь это относительно быстро.

 
Vasiliy Sokolov:

Если хочешь быструю связь - ничего быстрее union не сделаешь. Строку с параметрами ты действительно передаш через объекты очень быстро, может быть даже быстрее чем через ResourceCreate, НО на парсинге этой самой строки у тебя убъется вся скорость. Правда MQL очень быстрый язык, и даже медленный парсинг здесь это относительно быстро.

Проблема в том, что парсинг будет нужен в любом случае. Ведь даже записав строку в ресурс, ее потом нужно от туда извлечь, собрать, а потом разбить на части "номер параметра/значение параметра".

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

 
Реter Konow:

Проблема в том, что парсинг будет нужен в любом случае. Ведь даже записав строку в ресурс, ее потом нужно от туда извлечь, собрать, а потом разбить на части "номер параметра/значение параметра".

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

Петр, ты снова за старое. Ну сколько можно уже? Множество раз было уже сказано: значения и номера параметров ты передаешь и получаешь БЕЗ ИСПОЛЬЗОВАНИЯ СТРОК. В твоем примере ты передал и получил double без всякого парсинга строки. Так зачем ты снова пытаешься этот double засунуть в строку? Если тебе нужно передать сообщение пользователю - ты передаешь его как текст без всякого парсинга. Все.

 
Vasiliy Sokolov:

Петр, ты снова за старое. Ну сколько можно уже? Множество раз было уже сказано: значения и номера параметров ты передаешь и получаешь БЕЗ ИСПОЛЬЗОВАНИЯ СТРОК. В твоем примере ты передал и получил double без всякого парсинга строки. Так зачем ты снова пытаешься этот double засунуть в строку? Если тебе нужно передать сообщение пользователю - ты передаешь его как текст без всякого парсинга. Все.

Василий, я попробую объяснить. 

Значения параметров, - это не только цифры. Значением параметра может быть текст. Например, пользователь ввел текст в поле ввода. Этот текст передается из движка в советник. Или, советник на определенном событии посылает в GUI текст, с содержанием "Началась торговая сессия!".

Поскольку на каждом событии в советнике или в движке нужно передавать туда-обратно данные ВСЕХ типов (int,double,long,string...), то удобнее, одним способом все передавать через строку, а потом приводить к нужному типу.

Иначе, одним способом нужно передавать одни данные, а другие - другим способом. 

Никто не знает, каких данных пользователь будет передавать или получать больше. Может основными данными будут именно тексты. Со всех сторон получается, что строка, - универсальный носитель для передачи и приема информации.

 
Vasiliy Sokolov:


Кстати, зацени какого шага вперед я добился благодаря нашим вчерашним решениям (и твоей помощи):

Конкретно в этом примере, все передается через ресурс.



И все это делается вот через этот код в советнике:

void OnTimer()
  { 
   static int q1,q2,q3,a,b,c,d; 
   //------------------------------------
   LOAD_CANVAS_Last_10_bars();
   //---------------------------------
   if(!a) { q1++;}
   if(q1 == 200)a = 1;
   if(a)q1--;
   if(!q1)a = 0;
   //------------------------------------  
   CIRCLE(q1,q2,q3,clrGreen);  
   TRIANGLE(q1,q1,q1 + 100,q1 + 10,q1 + 50,q1 + 200,clrRed);  
   ELLIPSE(q1,q1,q1 + q1*2,q1 +  q1,clrBlue);  
   FILLED_CIRCLE(q1,20,20,clrBlue); 
   TRIANGLE(q1 + 10,q1,q1 + 10,q1 + 100,q1 + 50,q1 + 200,clrAqua);  
   ELLIPSE(q1 + 50,q1,q1 + q1*2,q1 * q1-30,clrBlack);  
   ELLIPSE(q1 + 52,q1,q1 + q1*3,q1 * q1-32,clrMagenta); 
   ELLIPSE(q1 + 54,q1,q1 + q1*4,q1 * q1-34,clrOrange); 
   FILLED_CIRCLE(q1 + 70,q1+20,20,clrDarkCyan);        
   FILLED_CIRCLE(q3,q2,40,clrGreen); 
   //------------------------------------
   REDRAW_CANVAS();
  }
 
Реter Konow:

Кстати, зацени какого шага вперед я добился благодаря нашим вчерашним решениям (и твоей помощи):

Конкретно в этом примере, все передается через ресурс.

Да, выглядит эффектно.

 
Реter Konow:

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

Здесь с тобой все-таки не соглашусь. Универсальной рабочей лошадкой для передачи информации является байтовый массив. 

Согласен, что передавать нужно и текст. И также согласен с тем, что текст удобнее всего передавать именно в строке. Но, фактически строка является лишь абстракцией. Когда ты передавал тексты через объекты на графике, длина этого текста была ограничена 64 символами. Это значит что на самом деле "за кулисами" ты передавал массив 64 байтов (MQL делал всю работу по преобразовании строки в массив и обратно за тебя, не явным образом). Если ты делаешь проект, в котром обмен информацией между MQL-программами является критическим и фундаментальным местом всего проекта, то и речи быть не может что бы отдавать эту функцию на откуп обобщенному решению. На твоем месте я бы разработал обобщенную систему передачи произвольных типов, включая строки, со строгим контролем преобразования. Это возможно сделать на базе union и чтения ресурсов. Но на базе парсинга строк это сделать проблематично, т.к. нет никаких гарантий того, что строка попавшая на парсинг будет валидна.