Как передать массив в свою функцию в DLL ?

 
Пытаюсь написать свою библиотеку для подключения к вашему пакету. Не получается передавать массивы данных.Получаю устойчивый "предсмертный дамп".

Вот как это выглядит в программах :

На <С>:

int testArray(double *arr,int index){
double data;
data = arr[index];
return (1);
}

Функция <testArray> - Экспортируется из DLL

-------------------------------------------------------------

Теперь из программы на <MQL-4> :

#import "test.dll"
int testArray(double arr[],int index);
#import

int start(){
double closeArrayM5[100];
int cnt;
// -------------------------------------------------------------------------------
ArrayCopySeries(closeArrayM5,MODE_CLOSE,Symbol(),PERIOD_M5);
cnt = testArray(closeArrayM5,1);
Print("Значение возврата = ",cnt);
return (0);
}

Что я делаю неправильно ?
C передачей одиночных параметров (передать строку ,число и так далее ) проблем не возникает ...
 
проблема возникает в том, что Вы хотите передать таймсерию. я уже как-то говорил, что функция ArrayCopySeries не копирует данные, а всего лишь говорит массиву о перенаправлении доступа. для передачи серий в длл-функцию мы специально предусмотрели функцию ArrayCopyRates. объявите двумерный массив со вторым измерением 6 и после "копирования" передавайте его своей функции. на самом деле - это массив структур
#pragma pack(push, 1)
struct RateInfo
  {
   time_t            ctm;                // текущее время в секундах
   double            open;
   double            low;
   double            high;
   double            close;
   double            vol;
  };
#pragma pack(pop)


если не получится, пишите - будем разбираться

 
Нет и так результат тот же
Кроме того есть проблема с использованием функции ArrayCopyRates

Вот получается как :

На <С> :
typedef struct RateInfo  {
   long              ctm;                // текущее время в секундах
   double            open;
   double            low;
   double            high;
   double            close;
   double            vol;
}RATE_INFO;

int  testArray(RATE_INFO *arr,int index){
   double data;
   return (0);
}


------------------------------------------------------------------------------------------------------
На MQL-4 кусок:

#import "testMeta.dll"

int testArray(double arr[],int index);

#import


int start(){
  double array[100][6];

  int cnt;

//  ArrayCopyRates(array,WHOLE_ARRAY,Symbol(),PERIOD_M5);
  ArrayCopyRates(array);
  Print("Значение = ",array[1][4]);
  cnt = testArray(array,1);
  Print("Возврат = ",cnt);
  return (0);



Результат таких манипуляций аналогичный. Для MQL-4 при попытке использовать функцию ArrayCopyRates
выдается ошибка при компиляции :

ArrayCopyRates(array,WHOLE_ARRAY,Symbol(),PERIOD_M5);
')' - wrong parameters count

Работает только если писать :

ArrayCopyRates(array);




 
во-первых, структура должна быть упакована на границу 1 байта.
во-вторых, в функции ArrayCopyRates нет параметра WHOLE_ARRAY (это Вы видимо из всплывающей подсказки взяли, поправим)
в-третьих, у нас неправильно передаётся массив баров. в следующем билде поправим.
я сейчас всё проверил, тексты должны быть такими:

.mq4 file
...
#import "ExpertSample.dll"
double GetRatesItemValue(double arr[,6],int,int,int);
...
   double open_0;
   double Rates[,6];
   int rates_total=ArrayCopyRates(Rates);
   Print("rates_total=",rates_total);
   open_0=GetRatesItemValue(Rates,rates_total,0,1);
   Print("Open[0]=",Open[0],"    open_0=",open_0);
...



.h file

#pragma pack(push, 1)
struct RateInfo
  {
   unsigned int      ctm;
   double            open;
   double            low;
   double            high;
   double            close;
   double            vol;
  };
#pragma pack(pop)

double __stdcall GetRatesItemValue(RateInfo* rates,int rates_total,int shift,int nrate);



.cpp file

double __stdcall GetRatesItemValue(RateInfo* rates,int rates_total,int shift,int nrate)
{
   if(rates==NULL)
      return 0.0;
   if(rates_total<0)
      return 0.0;
   if(shift<0 || shift>=rates_total)
      return 0.0;
   if(nrate<0 || nrate>5)
      return 0.0;

   int nitem=rates_total-1-shift;
   switch(nrate)
   {
      case 0: return double(rates[nitem].ctm);
      case 1: return rates[nitem].open;
      case 2: return rates[nitem].low;
      case 3: return rates[nitem].high;
      case 4: return rates[nitem].close;
      case 5: return rates[nitem].vol;
   }
   return 0.0;
}


повторяю, что всё будет работать со следующего билда. спасибо за замеченную проблему

 
Привет Slawa.
В 145-ом билде наблюдаются следующие проблемы:

1. Вышеописанный вами пример таки не работает.
В логе вижу такие вот строчки:
2004.12.26 14:30:23 UseDll1 EURUSD,H4: Open[0]=1.3531 open_0=0
2004.12.26 14:30:23 UseDll1 EURUSD,H4: rates_total=5860

2. Терминал постоянно требует подтверждать вызов функций импортируемых из DLL.
Перепробовал все комбинации чекбоксов "Разрешить импорт DLL" и "Подтверждать вызов функций DLL"
в "Сервис\Настройки\Советники" и в параметрах индикатора.
В частности проявляется при запуске терминала.
 
Slawa, сорри что настаиваю, но подтвердились ли мои результаты исследований :) ?
 
1. у меня всё в порядке. Вы как собирали свою DLL? принципиальный момент заключается в том, что Ваша функция должна за собой чистить стек. я могу выслать Вам готовую длл для анализа ситуации. напишите мне на адрес stringo@metaquotes.ru
2. не воспроизводится. но этот момент я ещё посмотрю
 
1. Спасибо за пример. Все работает.
2. Посмотрите. Уменя 145 билд. Постоянно требует подтверждения.
 
2. да, конечно. я внимательно посмотрю