Не могу передать в DLL массив double ... Скажите в чем может быть проблема?

 

объявляю массив и получаю закрытия всех баров
double close[];
ArrayCopySeries(close, MODE_CLOSE, Symbol(), PERIOD_H1);

в эксперт импортируется из библиотеки функция
int barShift(double daytimes[]);

однако в эту функцию получаю указатель 0
MT4_EXPFUNC int __stdcall func(const double *close) {
return 1;
}

F если просто масcив передаю в функцию который объявил как
double close[] = {1.34, 1.56};
То всё нормально получаю в функции указатель на эти значения 1.34 ....

в чем может быть проблема или так нельзя передавать параметры?

 
ArrayCopySeries не производит реального копирования, а обеспечивает перенаправление доступа. Читайте документацию https://docs.mql4.com/ru/array/ArrayCopySeries

Используйте либо ArrayCopy (тогда предварительно необходимо распределить массив нужного размера) либо ArrayCopyRates, которая сделана специально для передачи ценовых массивов в dll. Смотрите наши примеры.
 
Проблема знакомая. Судя по хэлпу, так нужно передавать параметры, но так и не разобрался какие адреса передает ArrayCopyRates()...
Возможно, это следствие реализации класса рейтов ( с удивлением обнаружил, что массивы рейтов doubl-ами не являются :( и их не передать как указатели: возможно реализованы как классы с соответствующими итераторами.....).
Увы, разобраться в краткие сроки у меня не получилось. Решил вопрос просто: объявил свои массивы рэйтов - (open, high .... ets) и переписал в них данные обычным циклом. После этого все передается.

Успехов.
 
stringo писал (а):
ArrayCopySeries не производит реального копирования, а обеспечивает перенаправление доступа. Читайте документацию https://docs.mql4.com/ru/array/ArrayCopySeries

Используйте либо ArrayCopy (тогда предварительно необходимо распределить массив нужного размера) либо ArrayCopyRates, которая сделана специально для передачи ценовых массивов в dll. Смотрите наши примеры.

Я документацию прочёл перед тем как программировать передачу в DLL указателей на массивы
Вот там написано

int ArrayCopySeries( double&array[], int series_index, string symbol=NULL, int timeframe=0)
Копирует массив-таймсерию в пользовательский массив и возвращает количество скопированных элементов.

Реального распределения памяти под массив данных и копирования не происходит. При обращении к такому массиву производится перенаправление доступа. Исключение составляют массивы, назначенные в качестве индексных в пользовательских индикаторах. В этом случае производится реальное копирование данных.

int ArrayCopyRates( double&dest_array[], string symbol=NULL, int timeframe=0)

Замечания: обычно массив используется, чтобы передать данные в DLL функцию.
Реального распределения памяти под массив данных и копирования не происходит. При обращении к такому массиву производится перенаправление доступа.

То есть, как видим, написано что в обоих массивах используется перенаправление доступа однако ArrayCopySeries можно использовать для передачи указателя на массив распределённый в MT а во второй почему то нельзя. Ну да ладно буду использовать ArrayCopySeries функцию. Она у меня работате без проблем.
Вы просто добавте в документацию для других непосвящённых, что массив заполненый функцией ArrayCopySeries нельзя использовать напрямую для передачи параметров в DLL
Но если хотиете передать этот массив то скопируйте его во временный массив используя ArrayCopy и передайте его в функцию. Тогда будет всё понятно и даже пробовать бы не стал.


Замечания: обычно массив используется, чтобы передать данные в DLL функцию.
Реального распределения памяти под массив данных и копирования не происходит. При обращении к такому массиву производится перенаправление доступа.
Причина обращения: