Ну вот. Я первый. :)
Правда наиболее "волшебные" места изрядно тормозят - но... может кто-то из чародеев 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) терминалов.

- www.mql5.com
Пока Владимир ждет от нас ответа, у меня появился вопрос тоже достойный подвига ;)
Как можно сделать, чтоб в одном ex5 импортировались функции из 32 и 64 DLL?
Так скажем чтоб сделать один ex5 для двух (32/64) терминалов.
Опять исключения просишь?
не, исключения я еще никогда не просил. И наверно не в них дело. дело ближе к #ifdef
Надеялся, что если Владимиру удалось кодом накрутить перегрузку операций, то может его метод подойдет и для автоматического включения требуемых DLL o_O
Эдакий #import внутри #define
Ну вот. Я первый. :)
Итак, кто может повторить подвиг?
Что-то долго не повторяют ваш подвиг :) , хотя в документации приведен аналогичный пример.
//--- перебираем строки для сложения 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; }
Что-то долго не повторяют ваш подвиг :) , хотя в документации приведен аналогичный пример.
Ну так сделайте по этой аналогии... делов-то!... :-))
А я посмотрю. ;)
Как можно сделать, чтоб в одном ex5 импортировались функции из 32 и 64 DLL?
Так скажем чтоб сделать один ex5 для двух (32/64) терминалов.
Функции назвать по разному. И в коде позтавить условные вызовы, в зависимости от битности терминала к разным функциям обращаться.
Сдаётся мне, что терминал грузит DLL при первом вызове. Нет вызовов - нет попытки загрузить и критического выкидыша.
Других способов пока не вижу. Битность терминала возвращает TerminalInfoInteger()
bool x64 = TerminalInfoInteger(TERMINAL_X64);
Всё это можно сделать прямо в библиотеке MyLib.ex5
void MyLibMultibitFunc() // библиотечная универсальная обёртка для DLL-функции { if(x64) { MyDll64Func(); } else { MyDll32Func(); } }
Функции назвать по разному. И в коде позтавить условные вызовы, в зависимости от битности терминала к разным функциям обращаться.
Сдаётся мне, что терминал грузит DLL при первом вызове. Нет вызовов - нет попытки загрузить и критического выкидыша.
Других способов пока не вижу. Битность терминала возвращает TerminalInfoInteger()
Всё это можно сделать прямо в библиотеке MyLib.ex5
Ага, тоже такого мнения, что терминал создаёт объёкт dll-функции только при первом вызове.
а по поводу битности кажется были какие то упоминания по поводу разного представления чисел были на форуме, если битное поле переменой выдаёт один резулт но будет 32 если другой то 64. Можно определить опытным путём.
Функции назвать по разному. И в коде позтавить условные вызовы, в зависимости от битности терминала к разным функциям обращаться.
Сдаётся мне, что терминал грузит DLL при первом вызове. Нет вызовов - нет попытки загрузить и критического выкидыша.
Не, господа, вы не поняли проблемы. Возможности с TERMINAL_X64 или _Is64 известны.
Но к сожалению терминал делает по другому.
- при броске на чарт он проверяет список используемых DLL и выводи в окно Зависимости список импортируемых функций
На тех DLL, которые не соответствуют битности он пишет предупреждение MQL5\Libraries\somedll64.dll' is not 32-bit version
- а когда затем нажимаешь ОК и эксперт типа запускается, то вот тут и ждет засада.
терминал выдает 193 ошибку и выгружает EX5
EX5 loading failed
Причем хочу обратить внимание, что в коде стоит только объявление DLL, и никакие функции из неё не импортируются
#import "somedll64.dll"
#import

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

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Предлагаю здесь публиковать и анализировать всякие "невозможности" mql5, наподобии этой: Условная компиляция.
Можно сначала показывать возможность (не раскрывая реализацию), дабы помучить любознательный народ и стимулировать собственное творчество читателя.
Но в конечном счёте требуется (обязательно!) раскрыть секрет и предоставить образец реализации.
Конечно такая "двухфазная" форма чревата мистификациями, однако буду рассчитывать на честные заявы чудодеев готовых "ответить за базар". :)
--
Итак........ НАЧАЛИ !