2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Использование (написанной в Delphi) DLL в Maple
Сообщение05.12.2015, 20:34 
Заслуженный участник


12/07/07
4522
[Я не прочитал внимательно документацию и написал выше неправильно.]

Для подключения DLL её функции должны быть описаны как stdcall, а не cdecl (как было написано в сообщении post956228.html#p956228).

В качестве примера приведу кусок тестовой библиотеки с несколькими функциями (Borland Delphi 5)
код: [ скачать ] [ спрятать ]
Используется синтаксис Delphi
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.

Близкий пример, см. в сообщении другой темы.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: DariaRychenkova


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group