2014 dxdy logo

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

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




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


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

Для подключения 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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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