Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Gomonov
8317
Vladimir Gomonov  

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

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

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

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

--

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

Vladimir Gomonov
8317
Vladimir Gomonov  
Итак........ НАЧАЛИ !

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

Правда наиболее "волшебные"  места изрядно тормозят - но... может кто-то из чародеев 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] );  
         //        ^  ^    Как это сделано???  :))  Жду Вашу версию!
        }
     }
  }

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

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

o_o
Модератор
24290
o_o  
Urain:
Ну для начала в х64 системах есть эмулированый запуск х86 программ. Вопрос в другом как в х86 запускать х64 программы?

Может вопрос вообще не в терминале а в каком то хитром компилировании этих самых DLL ?

Ведь работают DLL  от виндовых API.  Наприемр user32,  kernel32,  winmm, wininet  в 32/64 битном терминале.

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


Vladimir Gomonov
8317
Vladimir Gomonov  
Urain:
  Вопрос в другом как в х86 запускать х64 программы?
Это точно не получится.  Процессор x86 не может выполнять 64-битные инструкции.
sergeev:

Может вопрос вообще не в терминале а в каком то хитром компилировании этих самых DLL ?

Ведь работают DLL  от виндовых API.  Наприемр user32,  kernel32,  winmm, wininet  в 32/64 битном терминале.

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

Вот тут что-то есть.  Т.е. теоретически можно заставить работать 32-битные DLL и там и сям.

Наверное пора звать разработчиков.

// У меня на x64 перестала работать 32-битная DLL скомпиленная "наивным" образом.  Но возможно есть более хитрые способы компиляции.  Во всяком случае прецеденты "имеют место есть" (с) - 

Ведь работают DLL  от виндовых API.  Наприемр user32,  kernel32,  winmm, wininet  в 32/64 битном терминале.


o_o
Модератор
24290
o_o  

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


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


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

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


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

Опять исключения просишь?
o_o
Модератор
24290
o_o  
Urain:
Опять исключения просишь?

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

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

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

Yury Kulikov
39054
Yury Kulikov  
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;
     }

 

 

Vladimir Gomonov
8317
Vladimir Gomonov  
Yurich:

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

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

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

Vladimir Gomonov
8317
Vladimir Gomonov  
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(); }
}
Nikolay Demko
12594
Nikolay Demko  
MetaDriver:

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

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

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

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

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

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий