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

 

Работая над сабжем, дошел до индикаторов, делающих некоторые расчеты во внешней 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
 

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


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



 
Renat   :

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


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




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

 

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

 

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

 

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

 

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

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

 

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

 
stringo   :

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

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


Рад помочь:)
Причина обращения: