Ошибки, баги, вопросы - страница 2732

 
Igor Makanu:

что из себя представляет массив строк в памяти? - что такое массив строк?! 

О структуре данных МАССИВ.
Описываю с памяти для МТ5, по идеи то же должно касаться и МТ4, возможно что-то будет не так, но должно быть близко.

В целом масив состоит из двух частей: описание и данных, но так же может состоять только из данных.
Данные - память выделенная под элементы массива.
Описание - структура содержащая следующие поля, последовательность не сохранена:

flags - набор флагов описывающих массив: IsDynamic, IsSetAsSerrias, IsIndexBuffer, ...
size - количество созданных элементов в массиве;
capacity - количество зарезервированных элементов в массиве;
constructor pointer - указатель на функцию конструктор для элементов массива;
destructor pointer - указатель на функцию дестуктор для элементов массива;
data pointer - указатель на начало массива данных.

string  s_arr_1[]; - динамический массив, который состоит из описания и массива данных.
string  s_arr_2[10]; - тип массива зависит от расположения строки:
если используется как локальная переменная - то это статический массив, который состоит из описания и массива данных, расположенных последовательно на стеке.
если используется как поле в структуре/классе - это просто массив данных (часть с описанием отсутствует).
 
Sergey Dzyublik:

О структуре данных МАССИВ.
Описываю с памяти и для МТ5, по идеи то же должно касаться и МТ4, возможно что-то будет не так, но должно быть близко.

В целом масив состоит из двух частей: описание и данных, но так же может состоять только из данных.
Данные - память выделенная под элементы массива.
Описание - структура содержащая следующие поля, последовательность не сохранена:

flags - набор флагов описывающих массив: IsDynamic, IsSetAsSerrias, IsIndexBuffer, ...
size - количество созданных элементов в массиве;
capacity - количество зарезервированных элементов в массиве;
constructor pointer - указатель на функцию конструктор для элементов массива;
destructor pointer - указатель на функцию дестуктор для элементов массива;
data pointer - указатель на начало массива данных.

string  s_arr_1[]; - динамический массив, который состоит из описания и массива данных.
string  s_arr_2[10]; - тип массива зависит от расположения строки:
если используется как локальная переменная - то это статический массив, который состоит из описания и массива данных, расположенных последовательно на стеке.
если используется как поле в структуре/классе - это просто массив данных (часть с описанием отсутствует).

Спасибо!

была надежда, что может быть, какая то стандартная структура из WinAPI существует, но видимо со строками такого быть не может

ЗЫ: обмен с dll наладил, правда как и раньше в 2 вызова - запрос действия в dll и возврат требуемого размера буфера под string и 2-й вызов с копированием string в подготовленный буфер, ладно, задача локальная, но была надежда, что упрощу решение


Vladimir Simakov:
Массив строк-это массив объектов string. Где-то, кто-то из разработчиков писал, что там два поля: указатель на строку и 32 бита размера выделенной памяти. А вообще, такие вещи неплохо бы и в официальных доках прописать, что бы не гадать.

основная проблема что MQL4 и 5 это очень разные программы ))))

строки в MQL4 в .Net разбираются прекрасно StringBuilder Класс , в общем тут Вы правы, что строка это все таки не область памяти, а некий обьект

 
что из себя представляет массив строк в памяти? - что такое массив строк?! 

О структуре данных СТРОКА.
Описываю с памяти для МТ5, по идеи то же должно касаться и МТ4, возможно что-то будет не так, но должно быть близко.


Строка состоит из Описания + Данные.
Описание содержит следующие поля:

buffer_len - размер буфера выделенного под строку;
unicode_str pointer - указатель на поле unicode_str (смещение+8) в структуре Данных.

Данные содержат следующие поля:
flags - набор флагов описывающих строку: статическая(0x03)/динамическая (0x01), возможно и кодировки... 
len - длина строки;
unicode_str - непосредственно unicode_str строка на которую указывает unicode_str pointer из Описания.
 
Sergey Dzyublik:

О структуре данных СТРОКА.
Описываю с памяти для МТ5, по идеи то же должно касаться и МТ4, возможно что-то будет не так, но должно быть близко.


Строка состоит из Описания + Данные.
Описание содержит следующие поля:

buffer_len - размер буфера выделенного под строку;
unicode_str pointer - указатель на поле unicode_str (смещение+8) в структуре Данных.

Данные содержат следующие поля:
flags - набор флагов описывающих строку: статическая(0x03)/динамическая (0x01), возможно и кодировки... 
len - длина строки;
unicode_str - непосредственно unicode_str строка на которую указывает unicode_str pointer из Описания.

Вопрос. Это где-то описано, или сами разбирали?

[Удален]  
Igor Makanu:

хочу возвратить из .dll в MQL4 строку  (с MQL5 вообще без проблем все пишется)

в общем много копий уже наломал, вот и хочу спросить знающих: что из себя представляет массив строк в памяти? - что такое массив строк?! 

Передавайте вместо массива string только uchar массив. Так проще.
Например, можно так преобразовывать:

int StringArrayToCharArray(string &stringArr[],uchar &c[]) {
   uchar temp[];
   int pos=0;
   for (int i=0; i<ArraySize(stringArr); i++) {
      ArrayFree(temp);
      StringToCharArray(stringArr[i],temp);
      ArrayCopy(c,temp,pos);
      pos+=ArraySize(temp);
   }
   return pos;
}
//+------------------------------------------------------------------+

int CharArrayToStringArray(string &stringArr[],uchar &c[]) {
   ArrayFree(stringArr);
   int pos=0;
   int j=0;
   for (; pos<ArraySize(c); j++) {
      ArrayResize(stringArr,j+1);
      stringArr[j]=CharArrayToString(c,pos);
      while(c[pos]!=0) pos++;
      pos++;
   }
   return j;
}

Работает одинаково для MQL4 и MQL5

 
Geess:

Передавайте вместо массива string только uchar массив. Так проще.
Например, можно так преобразовывать:

Работает одинаково для MQL4 и MQL5

нужно из dll в MQL возвращать значения, в любом случае на стороне MQL нужно готовить буфер для приема данных

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

спасибо

 
Баги МТ5 (build 2402) проблемы с приоритетом вызовом перегруженных в namespace функций:
1) когда перегружена функция из глобального пространства имен;
2) когда перегружена системная функция.

void func(){
   printf("1");
}
      
namespace A{
   void func(){
      printf("2");
   }
   bool OrderSend(const MqlTradeRequest &trader_request, MqlTradeResult &trade_result){
      printf("2");
      return true;
   }
      
   class B{
      public:      
      void test(){
         func();                             // PRINT: 1   Expected result: 2
         
         MqlTradeRequest request;
         MqlTradeResult result;
         OrderSend(request, result);         // Compile Error: 'OrderSend' - override system function. Expected result: 2
      }
   };
};

void OnStart(){    
   A::B b;
   b.test();
}
 

Доброго времени суток!

Подскажите пожалуйста, есть эксперт Снайпер, он на новом билде не работает в МТ4 Альпари, можно как то исправить? Он даже на график не устанавливается. На билде 1090 работает.

Но терминал  МТ4 на 1090 билде не подключается к инету, пишет "Старая версия".

[Удален]  
valera_nur:

Доброго времени суток!

Подскажите пожалуйста, есть эксперт Снайпер, он на новом билде не работает в МТ4 Альпари, можно как то исправить? Он даже на график не устанавливается. На билде 1090 работает.

Но терминал  МТ4 на 1090 билде не подключается к инету, пишет "Старая версия".

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

Лучше всего, конечно, обратиться непосредственно к автору эксперта.

 

написал dll для MQL5 которая в WinForms на .Net создает в окошке графическую таблицу, портировал код под под нативные вызовы для MQL4

замерил скорость, чтобы оценить скорость обновления графики 5 столбцов и 5 строк таблицы

  for(int j = 0; j < 3; j++)
   {
      uint start = GetTickCount();
      for(int i = 0; i < 100000; i++)
      {
         string s = (string)(i) + ";" + (string)(i + 1) + ";" + (string)(i + 2) + ";" + (string)(i + 3) + ";" +  (string)(i + 4) + "\n" +
                    (string)(i) + ";" +  (string)(i + 1) + ";" + (string)(i + 2) + ";" + (string)(i + 3) + ";" + (string)(i + 4) + "\n" +
                    (string)(i) + ";" +  (string)(i + 1) + ";" + (string)(i + 2) + ";" + (string)(i + 3) + ";" + (string)(i + 4) + "\n" +
                    (string)(i) + ";" +  (string)(i + 1) + ";" + (string)(i + 2) + ";" + (string)(i + 3) + ";" + (string)(i + 4) + "\n" +
                    (string)(i) + ";" +  (string)(i + 1) + ";" + (string)(i + 2) + ";" + (string)(i + 3) + ";" + (string)(i + 4) + "\n";
         TBL_FillAllTable(htbl, s);
      }
      uint time = GetTickCount() - start;
      PrintFormat("Цикл  %d время = %d ms", j, time);
   }

.....
void TBL_FillAllTable(int handle, string data, string  ColSeparator = ";", string RowSeparator = "\n")
{
#ifdef __MQL4__   refreshalldata(handle,data,ColSeparator,RowSeparator); #endif
#ifdef __MQL5__   SHARPTABLE::refreshalldata(handle, data,ColSeparator, RowSeparator); #endif
}
//+------------------------------------------------------------------+

MQL5:

2020.05.05 22:55:33.220 tbl_tst (EURUSD,H1) Цикл  0 время = 143563 ms

2020.05.05 22:57:55.370 tbl_tst (EURUSD,H1) Цикл  1 время = 142156 ms

2020.05.05 23:00:19.121 tbl_tst (EURUSD,H1) Цикл  2 время = 143750 ms

MQL4:

2020.05.05 22:51:25.359 tbl_tst EURUSD,H1: Öèêë  2 âðåìÿ = 66813 ms

2020.05.05 22:50:18.551 tbl_tst EURUSD,H1: Öèêë  1 âðåìÿ = 69219 ms

2020.05.05 22:49:09.332 tbl_tst EURUSD,H1: Öèêë  0 âðåìÿ = 67062 ms


код dll на 99% один в один, портировал под MQL4 примерами из статьи https://www.mql5.com/ru/articles/249


по моему очень большая разница 

Файлы:
tst_winforms.jpg  239 kb