Import double[] function from DLL

 
Всем Привет

есть необходимость импортировать из DLL написанной на Delphi функцию, которая возращает массив из double.


library myMADLL

type
TSeries = array of Double;

function MyMA (const SrcA: TSeries; ALength, APhase: Integer): TSeries; stdcall;


export MyMA;


в индикаторе:


#import "myMADLL.dll"

double[] MyMA (double inSeries[], int a, int b);


MетаЕдитор ругается на первое обьявление double[]



Как быть?





 

У меня обмен с dll происходил бы так:

void MyMA (double & inSeries[], int a, int b);

Т.е. входной параметр - он же - выходной параметр.

 
jartmailru >>:

У меня обмен с dll происходил бы так:

void MyMA (double & inSeries[], int a, int b);

Т.е. входной параметр - он же - выходной параметр.

а как передать цену в функцию,

я хочу передать цену закрытия, kak double[]

MyMA (Close, 10,0);

а потом в самой функции в Delphi распечатываю цену для того что бы посмотреть что приходит на вход, оказывается приходит серия с нулевой длинной

 

Мне почему-то кажется, что массив Close нельзя использовать как массив :-)

Не идет он как double & array[].

Я бы объявил массив double array[] как переменную и копировал бы серию Close в нее

после вызова ArrayResize(array, newSize).

А получившуюся переменную передавал бы в функцию dll.

.

Возможно, профи вам подскажут, как сделать по-другому (например, ArrayCopySeries),

но я таким вариантом пользоваться не люблю - можно тупо поменять котировки в окне :-(.

Меня эта возможность очень заинтересовала, но оказалось,

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

на сервер ДЦ они после изменения не проходят :-(.

 

McLaud попробуй передавать массив через указатель, в качестве параметра размер массива.

В Samples на С++ так делается:

MT4_EXPFUNC double __stdcall GetArrayItemValue(const double *arr,const int arraysize,const int nitem)
{
//----
if(arr==NULL)
{
printf("GetArrayItemValue: NULL array\n");
return(0.0);
}
if(arraysize<=0)
{
printf("GetArrayItemValue: wrong arraysize (%d)\n", arraysize);
return(0.0);
}
if(nitem<0 || nitem>=arraysize)
{
printf("GetArrayItemValue: wrong item number (%d)\n", nitem);
return(0.0);
}
//----
return(arr[nitem]);
}

То есть тут массив передается через указатель arr, в arraysize передается его размер, а nitem-номер элемента значение которого возвращает функция.

А коде на MQL4 прототип функции выглядит так:

double GetArrayItemValue(double arr[],int,int);

Пример использования:

double arr[5]={1.5, 2.6, 3.7, 4.8, 5.9 };
//---- get first item from passed array
price=GetArrayItemValue(arr,5,0)


Это я вытащил из папки \experts\Samples\

 

Luptator: 

McLaud хотел сделать следующее:

1. вернуть массив даблов 

    делается это через входной параметр, так:

    void MyMA (double & inSeries[], int a, int b);

    (см. мой пост №1 в этой ветке)

2. передать цену закрытия, причем как Close.

    Как Close передать цену закрытия нельзя.

    нужно массив аллоцировать новый.

    и в него копировать цены закрытия

    (см. мой пост № 2 в этой ветке)

3. пишет он на Delphi, причем,

    судя по тому, что он распечатывал значения, переданные в dll,

    связка mql - dll у него работает. Т.е. пример на С++ ему не в тему.