[Я не прочитал внимательно документацию и написал выше неправильно.]
Для подключения DLL её функции должны быть описаны как
stdcall, а не
cdecl (как было написано в сообщении
post956228.html#p956228).
В качестве примера приведу кусок тестовой библиотеки с несколькими функциями (Borland Delphi 5)
library Tst;
Type T3Vector = array[0..2] of Double;
function MySum(A: T3Vector): Double; stdcall;
{Пример функции: принимающей массив с фиксированным числом элементов типа Double}
{ и возвращающей результат типа Double. }
var
i: LongWord;
begin
Result:= 0;
for i:= 0 to 2
do Result:= Result + A[i];
{Функция модифицирует копию переменных, }
{ после возврата вектор a остаётся без изменений.}
{Для демонстрации обнуляем массив}
for i:= 0 to 2 do A[i]:= 0;
end;
procedure Vmul(var A: T3Vector; c: Double) stdcall;
{Пример процедуры, модифицирующей по ссылке массив.}
var
i: LongWord;
begin
for i:= 0 to 2
do A[i]:= A[i]* c;
end;
type
TDA = Array of Double;
function SumOfN(A: Pointer; N:LongWord): Double; stdcall;
{Пример функции принимающей массив с переменным числом элементов и }
{возвращающей результат типа Double. }
var
i: LongWord;
begin
Result:= 0;
for i:= 0 to N-1
do Result:= Result + TDA(A)[i];
end;
exports MySum, Vmul, SumOfN;
end.
Рабочий лист Maple 15 Classic Worksheet
Код:
> MySum:= define_external('MySum', 'a'::ARRAY(0..2, float[8]), RETURN::float[8], LIB="Tst.dll"):
> VMul:= define_external('Vmul', 'a'::ARRAY(0..2, float[8]), 'b'::float[8], LIB="Tst.dll"):
> SumOfN:= define_external('SumOfN', 'a'::ARRAY(1..'j', float[8]), N::integer[4], RETURN::float[8], LIB="Tst.dll"):
> dmul(2, 3);
> a:= Array([1, 2, 3], datatype=float[8]); MySum(a); a;
a := [1., 2., 3.]
6.
[1., 2., 3.]
> a:= Array([1, 2, 3]); MySum(a);
a := [1, 2, 3]
Error, invalid input: MySum expects its 1st argument, a, to be of type rtable(datatype = float[8]), but received Array(1..3, [...], datatype = anything)
> a:= Array([1, 2, 3], datatype=float[8]); VMul(a, 2.0); a;
a := [1., 2., 3.]
[2., 4., 6.]
> j:=10;
> a:= Array([seq(i, i=1..j)], datatype=float[8]); SumOfN(a, j);
j := 10
a := [1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]
55.
Близкий пример, см. в
сообщении другой темы.