Скачать MetaTrader 5

Еще раз о переносе с MQL4 на MQL5

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Получи статус продавца и начни продавать свои сигналы!
Alexey Subbotin
4998
Alexey Subbotin 2009.12.25 00:58 

Работая над сабжем, дошел до индикаторов, делающих некоторые расчеты во внешней DLL. На этапе тестирования выяснилось, что если в 4-ке можно было передать в некую DLL-функцию динамический массив по ссылке и записать в него некоторые значения, то в 5-й версии языка это почему-то не получается...

 

Для примера: проделываю примерно следующие манипуляции 

//test.mq5
#import "test.dll"
   void TestFunc(double &a[]);
#import

...


int OnCalculate(...)
{
...
   double a[];
   ArrayResize(a,100);
   for(int i=0;i<100;i++) a[i]=i;
   TestFunc(a);
...
}

Если теперь в самой DLL вывести на экран значения a[i], например, через MessageBox(), то они получаются совсем не 0,1,2,3 и т.д., а всякая белиберда, явно не с того адреса памяти, с какого нужно.

 

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

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
MetaQuotes
Админ
24952
Renat Fatkhullin 2009.12.25 01:26  

Тут надо иметь в виду, что динамический массив в MQL5 имеет предварительное описание.


Посмотрите в документации Объект динамического массива.



Alexey Subbotin
4998
Alexey Subbotin 2009.12.25 14:11  
Renat   :

Тут надо иметь в виду, что динамический массив в MQL5 имеет предварительное описание.


Посмотрите в документации Объект динамического массива.




это-то понятно, справку я читал вдоль и поперек.

 

я насколько понимаю, нечто подобное и в четверке существовало (хоть и не описано в справке) - причем и там, и там фактически средствами MQL эти структуры все равно не достать. Тем не менее, каким-то образом же должны передаваться массивы во внешние функции не MQL5. В 4 версии языка это реализовано: при вызове внешней функции ей передается не структура, а адрес данных в памяти, а вот с пятой вопрос. При этом компилятор ошибку не выдает, и функция вызывается без проблем, т.е. конвенции о вызове получается соблюдены, что говорит о том, что разработчик MQL5 намеревался эту проблему решить аналогичным способом как в 4. Тем не менее, исследование показывает, что указатель на данные формируется неверно - он указывает не туда, где находятся данные, а на другое место (на какое - не знаю).

 

Поэтому и вопрос к разработчикам:  когда я передаю массив в DLL, куда указывает этот параметр - на данные или куда-то еще. А если куда-то еще, то как достать данные?

 

Основные опасения связаны с тем, что если данный механизм не будет реализован, то целый класс полезных инструментов полностью выпадает из рук трейдера - например, придется выдумывать новые способы работы как с пользовательскими DLL, реализующими обработку данных, так и с такими популярными среди трейдеров/программистов продуктами как Matlab, Neuroshell и т.п. 

Slawa
Модератор
6841
Slawa 2009.12.25 16:22  

Спасибо за сообщение. Баг нашли. Исправляем.

Когда Вы передаёте массив в DLL, то в DLL будет получен адрес начала буфера данных. 

Ilyas
1206
Ilyas 2009.12.25 16:39  

Ошибка в передаче данных динамического массива исправлена, ждите обновлений. 

Alexey Subbotin
4998
Alexey Subbotin 2009.12.25 20:05  
stringo   :

Спасибо за сообщение. Баг нашли. Исправляем.

Когда Вы передаёте массив в DLL, то в DLL будет получен адрес начала буфера данных. 


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