Можно ли вернуть 2 одномерных массива из dll

 
Столкнулся с проблемой возврата 2-х одномерных массивов из dll написанной на Паскале.
Соглашение о вызовах учел (stdcall).
При запуске тестового скрипта терминал просто замерзает и все.
Заранее благодарен.
 
Приведите код. Да, размер массива в дллке менять нельзя. Тем паче передавать MQL коду созданный в дллке массив.
 
вызывающий скрипт:
//+------------------------------------------------------------------+
//| fft test.mq4 |
//+------------------------------------------------------------------+
#import "fftlib.dll"
void FFTR(double A[], int N, double FA[], double FB[]);
#import

double buf[1];
double fa[1];
double fb[1];
int n = 10;
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
int len = MathPow(2,n);
ArrayResize(buf,len);
ArrayResize(fa,len);
ArrayResize(fb,len);
//----
int i;
for(i=0;i<len;i++) buf[i]= Close[i];
FFTR(buf, len, fa, fb);
//Alert(len);
Alert("Скрипт закончил свою работу");

//----
return(0);
}
//+------------------------------------------------------------------+


Главный модуль dll

unit MainUnit;

interface

uses
  xxxxxxxxxxxxx;

procedure DLLFinalization;
procedure DLLInitialization;
procedure StartSynchronisation;
procedure StopSynchronisation;
procedure FFTR(const A: TRealArray; const N:Integer; out FA, FB:
  TRealArray); stdcall;
procedure iFFTR(const FA, FB: TRealArray; const N: Integer; out A:
  TRealArray); stdcall;

exports
FFTR, iFFTR;

var
hMutex1: THandle = 0;
hMutex2: THandle = 0;
hMutex3: THandle = 0;
hMutex4: THandle = 0;

implementation

procedure DLLFinalization;
begin
//
end;

procedure DLLInitialization;
begin
//
end;

procedure StartSynchronisation;
begin
hMutex1:= CreateMutex(nil, False, '');
hMutex2:= CreateMutex(nil, False, '');
hMutex3:= CreateMutex(nil, False, '');
hMutex4:= CreateMutex(nil, False, '');
end;

procedure StopSynchronisation;
begin
CloseHandle(hMutex1);
CloseHandle(hMutex2);
CloseHandle(hMutex3);
CloseHandle(hMutex4);
end;

procedure FFTR(const A: TRealArray; const N: Integer; out FA, FB:
  TRealArray);
var
  F: TComplexArray;
I: Integer;
begin
SetLength(FA,N);
SetLength(FB,N);
if WaitForSingleObject(hMutex3, INFINITE) = WAIT_OBJECT_0 then
try
  FFT(A, N, F);
for I := 0 to High(A) do
begin
FA[I]:= F[I].X;
FB[I]:= F[I].Y;
end;
except
end;
Sleep(15);
ReleaseMutex(hMutex3);
end;

procedure iFFTR(const FA, FB: TRealArray; const N: Integer; out A:
  TRealArray);
var
  F: TComplexArray;
I: Integer;
begin
if WaitForSingleObject(hMutex4, INFINITE) = WAIT_OBJECT_0 then
try
for I := 0 to High(FA) do
begin
F[I].X:= FA[I];
F[I].Y:= FB[I];
end;
    iFFT(F, N, A);  
except
end;
Sleep(15);
ReleaseMutex(hMutex4);
end;

end.

PS: в тестовом приложении все отрабатывает корректно
 
Нет, FA и FB это выходные массывы. Там же стоит идентификатор out
 

Массивы по ссылке передавать надо.

 
Я в С++ не очень силен. Как понимаю скрипт нужно переделать так:
вызывающий скрипт:
//+------------------------------------------------------------------+
//| fft test.mq4 |
//+------------------------------------------------------------------+
#import "fftlib.dll"
void FFTR(double A[], int N, double &FA[], double &FB[]);
#import

double buf[1];
double fa[1];
double fb[1];
int n = 10;
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
int len = MathPow(2,n);
ArrayResize(buf,len);
ArrayResize(fa,len);
ArrayResize(fb,len);
//----
int i;
for(i=0;i<len;i++) buf[i]= Close[i];
FFTR(buf, len, fa, fb);
//Alert(len);
Alert("Скрипт закончил свою работу");

//----
return(0);
}
//+------------------------------------------------------------------+
 
Так тоже виснет
 
Как же их подружить? При передаче динамического массива принимающий массив автоматичестки устанавливается размером равным передающему при одинаковых типах...
Как здесь быть? Пока не знаю. Есть мысли?
 
TRealArray = array of Double;
 
Debugger >>:
Есть мысли?

А как же. Переделать все передаваемые массивы на указатели. Принимать указатели. Работать с указателем. Убрать изменение размеров.

Просчет преобразования Фурье штука медленная, так что спокойно без потери производительности можно завести два локальных массива типа array of double.

Перед преобразованием скопировать данные туда, а после преобразования оттуда.

Кодом, извините, помогу вряд ли. На Delphi последний раз писал лет 5 назад, так что читать код могу, писать вслепую никак, только тезисно.

 
На указатели переделаю, а вот убраь изменение размеров никак.
Причина обращения: