В MQL5 всегда есть место подвигу ! ;)

 

Предлагаю здесь публиковать и анализировать всякие "невозможности" mql5,  наподобии этой: Условная компиляция.

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

Но в конечном счёте требуется (обязательно!) раскрыть секрет и предоставить образец реализации

Конечно такая "двухфазная" форма чревата мистификациями, однако буду рассчитывать на честные заявы чудодеев готовых "ответить за базар". :)

--

Итак........ НАЧАЛИ !

 
Итак........ НАЧАЛИ !

Ну вот.  Я первый. :)

Правда наиболее "волшебные"  места изрядно тормозят - но... может кто-то из чародеев mql5 немного погодя найдёт способ ускорить?

//  Насколько тормозят, Вы можете увидеть сами, тест как раз  и посвящён замеру скорости работы.

Вот этот код работает в соответствии с обычным синтаксисом употребления двумерных массивов.

void OnStart()
  {
   float  FA[5][3];
   long st=GetTickCount();
   for(int t=0;t<1000000;t++)
     {
      for(int i=0;i<5;i++)
        {
         for(int j=0;j<3;j++)
           {
            FA[i][j] = (i+1.5)*(j+1.3);
           }
        }
     }
   Print("====",GetTickCount()-st," ms ====");
   
   st=GetTickCount();
   C2DMagicArray  MA(5,3);   
   for(int t=0;t<1000000;t++)
     {
      for(int i=0;i<MA.SizeL();i++)
        {
         for(long j=0;j<MA.MaxR();j++)
           {
            MA[i][j] = (i+1.5)*(j+1.3);  
            // ^  ^  Как это сделано ??? Можете повторить ? :))
           }
        }
     }
   Print("====",GetTickCount()-st," ms ====");
   st=GetTickCount();
   for(int t=0;t<1000000;t++)
     {
      for(int i=0;i<MA.SizeL();i++)
        {
         for(long j=0;j<MA.MaxR();j++)
           {
            MA.Set(i,j,float((i+1.5)*(j+1.3)));
           }
        }
     }
   Print("====",GetTickCount()-st," ms ====");

   for(int i=0;i<MA.SizeL();i++)
     {
      for(int j=0;j<MA.MaxR();j++)
        {
         Print( MA[i][j] );  
         //        ^  ^    Как это сделано???  :))  Жду Вашу версию!
        }
     }
  }

Скомпилировать код Вам пока не удастся : инклюдники будут попозже... - иначе не так интересно будет. :)

Итак, кто может повторить подвиг?

Файлы:
 

Пока Владимир ждет от нас ответа, у меня появился вопрос тоже достойный подвига ;)


Как можно сделать, чтоб в одном ex5 импортировались функции из 32 и 64 DLL? 
Так скажем чтоб сделать один ex5 для двух (32/64) терминалов.


Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
 
sergeev:

Пока Владимир ждет от нас ответа, у меня появился вопрос тоже достойный подвига ;)


Как можно сделать, чтоб в одном ex5 импортировались функции из 32 и 64 DLL? 
Так скажем чтоб сделать один ex5 для двух (32/64) терминалов.

Опять исключения просишь?
 
Urain:
Опять исключения просишь?

не, исключения я еще никогда не просил.  И наверно не в них дело.  дело ближе к #ifdef

Надеялся, что если Владимиру удалось кодом накрутить перегрузку операций, то может его метод подойдет и для автоматического включения требуемых DLL   o_O

Эдакий #import внутри #define

 
MetaDriver:

Ну вот.  Я первый. :)

Итак, кто может повторить подвиг?

Что-то долго не повторяют ваш подвиг :)  , хотя в документации приведен аналогичный пример.

//--- перебираем строки для сложения
   for(int i=0;i<rows;i++)
     {
      //--- запишем результаты сложений строк матриц в массив
      for(int k=0;k<cols;k++)
        {
         arr[k]=this[i][k]+m[i][k];
        }
      //--- поместим массив в строку матрицы
      res[i]=arr;
     }
 
Yurich:

Что-то долго не повторяют ваш подвиг :)  , хотя в документации приведен аналогичный пример.

Ну так сделайте по этой аналогии...  делов-то!... :-))

А я посмотрю. ;)

 
sergeev:

Как можно сделать, чтоб в одном ex5 импортировались функции из 32 и 64 DLL? 
Так скажем чтоб сделать один ex5 для двух (32/64) терминалов.

Функции назвать по разному.  И в коде позтавить условные вызовы, в зависимости от битности терминала к разным функциям обращаться.

Сдаётся мне, что терминал грузит DLL при первом вызове. Нет вызовов - нет попытки загрузить и критического выкидыша.

Других способов пока не вижу.   Битность терминала возвращает TerminalInfoInteger()

bool x64 = TerminalInfoInteger(TERMINAL_X64);

Всё это можно сделать прямо в библиотеке  MyLib.ex5



void MyLibMultibitFunc()  // библиотечная универсальная обёртка для DLL-функции
{
  if(x64) { MyDll64Func(); }
  else { MyDll32Func(); }
}
 
MetaDriver:

Функции назвать по разному.  И в коде позтавить условные вызовы, в зависимости от битности терминала к разным функциям обращаться.

Сдаётся мне, что терминал грузит DLL при первом вызове. Нет вызовов - нет попытки загрузить и критического выкидыша.

Других способов пока не вижу.   Битность терминала возвращает TerminalInfoInteger()

Всё это можно сделать прямо в библиотеке  MyLib.ex5

Ага, тоже такого мнения, что терминал создаёт объёкт dll-функции только при первом вызове.

а по поводу битности кажется были какие то упоминания по поводу разного представления чисел были на форуме, если битное поле переменой выдаёт один резулт но будет 32 если другой то 64. Можно определить опытным путём.

 
MetaDriver:

Функции назвать по разному.  И в коде позтавить условные вызовы, в зависимости от битности терминала к разным функциям обращаться.

Сдаётся мне, что терминал грузит DLL при первом вызове. Нет вызовов - нет попытки загрузить и критического выкидыша.

Не, господа, вы не поняли проблемы.  Возможности с TERMINAL_X64 или _Is64  известны.

Но к сожалению терминал делает по другому.

- при броске на чарт он проверяет список используемых DLL и выводи в окно Зависимости список импортируемых функций
На тех DLL, которые не соответствуют битности он пишет предупреждение MQL5\Libraries\somedll64.dll' is not 32-bit version

- а когда затем нажимаешь ОК и эксперт типа запускается, то вот тут и ждет засада.

терминал выдает 193 ошибку и выгружает EX5

Cannot open 'MQL5\Libraries\somedll64.dll' (193)
EX5 loading failed

Причем хочу обратить внимание, что в коде стоит только объявление DLL,  и никакие функции из неё не импортируются

#import "somedll64.dll"
#import
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
 

И поэтому есть вопрос номер один.

Как в 64 приложение происходит импорт функций из 32 битных dll типа  user32.dll  и т.д. Или для них есть копии в системе с таким названием и создается OOP пространство ?

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