DLL на Lazarus, проблема возврата массива

 

Ранее мной была написана DLL на Delphi 7, пример функции:

type
  TDoubleArray = array of Double;

function SMA100(const close: TDoubleArray; size: integer): double; stdcall; export;
var
  i: integer;
begin
  Result := 0;
  for i := 0 to size - 1 do
    Result := Result + close[i];
  Result := Result / size;
  close[0] := -1;
end;

соответственно использование в MQL4:

#import "test.dll"
   double SMA100(double& low[], int size);
#import

int start()
{
	double close[];

	ArrayResize(close, 100);
	ArrayCopy(close, Close, 0, 0, 100);

	double sma = SMA100(close, 100);
	
	Print(sma + ", " + close[0]);
}

Это работало - sma рассчитывался, содержимое массива менялось.


Сейчас нужно перейти на Lazarus (free pascal), но в нём своя интерпретация параметров const, из-за чего нельзя с ними работать на запись, компилятор ругается на указанную строку.


Прошу совета по данному вопросу.


P.S. Здесь привел тестовый пример функции, в которой мало смысла. В действительности функции сложнее, вынос которых в DLL полностью оправдан.

 

Всё ещё актуально.

Перепробовал, вроде бы, все способы вывода параметров из DLL на freepascal, но почти все приводят к ошибке терминала:


Способы, которые к ошибке не приводят, данные не передают.


Код проекта для Lazarus и скрипт для проверки прилагаю. Подойдёт любой способ передачи массива, даже самый дурацкий (кроме "через файл" и т.п. медленные способы).

Файлы:
test.zip  2 kb
 
afx000 писал(а) >>

Всё ещё актуально.

Перепробовал, вроде бы, все способы вывода параметров из DLL на freepascal, но почти все приводят к ошибке терминала:

Способы, которые к ошибке не приводят, данные не передают.

Код проекта для Lazarus и скрипт для проверки прилагаю. Подойдёт любой способ передачи массива, даже самый дурацкий (кроме "через файл" и т.п. медленные способы).

Ответ на самом деле простой, если только вы знаете как передавать указател из MQ4,

А в длл-ке должна быть запись такого вида:

type
  TDoubleArray = array of Double;
  PDoubleArray = ^TDoubleArray;


function SMA100(close: PDoubleArray; size: integer): double; stdcall; export;
var
  i: integer;
begin
  Result := 0;
  for i := 0 to size - 1 do
    Result := Result + close^[i];
  Result := Result / size;
  close^[0] := -1;
end;
И все, должно работать!
 

Как я обрадовался... ведь я примерно то же самое пробовал, но немного по-другому, думал - ну вот оно! Но вот облом, терминал всё равно критическую ошибку показал =(


Или... а что Вы имеете в виду под передачей указателя в MQ4?

Насколько я понял, при использовании double& как раз указатель передается. Или нет? Нужно как-то по-другому?

 
afx000 писал(а) >>

Как я обрадовался... ведь я примерно то же самое пробовал, но немного по-другому, думал - ну вот оно! Но вот облом, терминал всё равно критическую ошибку показал =(

Или... а что Вы имеете в виду под передачей указателя в MQ4?

Насколько я понял, при использовании double& как раз указатель передается. Или нет? Нужно как-то по-другому?

Описанный мной подход верен на 99%, на практике сам использую работу обмена данных только через указатели.

Скорей всего проблема непосредственно в самом фри-паскале. Помниться я тоже хотел переписать один проект на фри-паскале и как раз это была длл-ка. Уж не помню из-за чего, но от этой затеи пришлось отказаться.

Советую вам обратиться на официальный форум по фри-паскалю, может вам дадут дельный совет там.

Успехов.

 
afx000 >>:

Всё ещё актуально.

Перепробовал, вроде бы, все способы вывода параметров из DLL на freepascal, но почти все приводят к ошибке терминала:



Попробуй ради интереса перекомпилить и запустить не из терминала альпари ;)

 
GarF1eld >>:

Попробуй ради интереса перекомпилить и запустить не из терминала альпари ;)

А как это связано с терминалом именно отдельно выбранного ДЦ ?

 
olyakish >>:

А как это связано с терминалом именно отдельно выбранного ДЦ ?

Думаю, никак не связано. Имеется в виду вызов вообще не из терминала, а вообще из другой программы.

Это способ проверки того, что именно не работает, - dll на freepascal (в моей реализации :) ) или связка с ней из MT.

Пока времени не было проверить. Как проверю - отпишу сюда.

 
"Решилось" переходом на Turbo Delphi. Тоже халява (ну давит меня жаба на IDE за штуку зелени ради пары-тройки либ для МТ :) ), но без таких вот проблем, старый код с D7 заработал без изменений вообще :)
 

У меня этот пример, который выше, в zip-е - отлично работает, ни каких ошибок.


Ver: MT4 - 223, FPC - 2.2.4


кроме того, поменял в паскалевском файле строчку {$mode objfpc}{$H+} на {$mode delphi}{$H+}

Причина обращения: