Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Вниз

создание на Delphi dll для Матлаба   Найти похожие ветки 

 
Tdu ©   (2007-07-23 13:44) [0]

Для ускорения работы программы на Матлабе хотелось бы наиболее часто используемые функции и процедуры оформить в виде dll. Однако, я не владею C++. Попробовал создать dll на Delphi, однако Матлаб отказался ее воспринять.
Кто-нибудь имеет опыт создания на Delphi библиотек dll для Matlab?


 
umbra ©   (2007-07-23 13:52) [1]


> библиотек dll для Matlab

а чем они отличаются от обычных длл?


 
Inco   (2007-07-23 16:42) [2]

Если нужна спецификация вызова С - надо ставить модификатор функции cdecl.
Конечно, если Матлаб воспринимает "обычные" dll...


 
TUser ©   (2007-07-23 16:58) [3]


> cdecl.

sdcall


 
Loginov Dmitry ©   (2007-07-24 00:03) [4]

> Для ускорения работы программы на Матлабе хотелось бы наиболее
> часто используемые функции и процедуры оформить в виде dll.
> Однако, я не владею C++. Попробовал создать dll на Delphi,
> однако Матлаб отказался ее воспринять.
> Кто-нибудь имеет опыт создания на Delphi библиотек dll для
> Matlab?


жесть! А как потом из Матлаба эти функции будут вызываться? (интересно просто, т.к. сам ни разу не видел)


 
Loginov Dmitry ©   (2007-07-24 00:04) [5]

кстати, можно DLL-ку как СОМ-сервер сделать. В Матлабе поддержка СОМ/DСОМ реализована весьма неплохо.


 
Tdu ©   (2007-07-24 07:11) [6]

Уточняю проблему:
dll, когда-то написанная для меня моим коллегой на C++, работает в Матлабе без проблем: я обращаюсь к ней по имени ddl-ки, как к обычной процедуре, описанной в Матлабе. К сожалению, я сейчас не могу пользоваться услугами этого коллеги, поэтому и решил создавать dll-ки сам, но я владею только Матлабом и Delphi.

Из руководства по Delphi:
«Для того, чтобы правильно осуществлять вызовы процедур и функций, хранимых в DLL, а также создавать DLL, которые могут быть использованы разработчиками, применяющими не Delphi, а другие инструменты, следует описывать подпрограммы с указанием соглашения о вызове, называемым стандартным, принятым в C++. Для этого после описания процедуры указывается ключевое слово stdcall.»


При создании dll я перепробовал все варианты: не только stdcall, но и cdecl, safecall, register, pascal. Однако результат был один и тот же: при попытке обратиться к dll Матлаб отвечал:

Mex file entry point is missing.  Please check the (case-sensitive)
spelling of mexFunction (for C MEX-files), or the (case-insensitive)
spelling of MEXFUNCTION (for FORTRAN MEX-files).
??? Invalid MEX-file


 
Сергей М. ©   (2007-07-24 09:12) [7]


> Tdu ©   (24.07.07 07:11) [6]


Это

http://www.softru.net.ru/publ/1-1-0-1

читал ?

mex.pas имеешь ?


 
Сергей М. ©   (2007-07-24 10:01) [8]

Учись, студент, гуглить)

http://www-user.tu-chemnitz.de/~heha/viewzip.cgi/messtech/pasmex32.zip/pasmex32.pas?auto=PAS


 
Tdu ©   (2007-07-24 12:07) [9]

1) Посмотрел ссылку http://www.softru.net.ru/publ/1-1-0-1. Но ведь там "Программирование на языке С для пакета MATLAB", а мне нужно на Delphi для MATLAB.

2) mex.pas не нашел. А для чего?


 
Сергей М. ©   (2007-07-24 12:12) [10]


> Но ведь там "Программирование на языке С для пакета MATLAB",
>  а мне нужно на Delphi для MATLAB


Причем здесь С ? Ты общую концепцию организации взаимодействия, изложенную в статье, изучил ?


> mex.pas не нашел. А для чего?


А ты что, прототип своей ф-ции mexFunction() выбираешь от балды ?)


 
Tdu ©   (2007-07-25 11:23) [11]

Увы, моих познаний пока не хватило, чтобы реализовать эту идею.
Т.е. example, приведенный в шапке, реализовался, т.е. получилась dll, при обращении к которой из Матлаба выдается сообщение "Hallo Welt" (правда для этого пришлось заменить stdcall на cdecl). А вот добиться что-нибудь более полезного пока не удается.

Сергей, а ты сам попробовал?
Можешь привести алгоритм получения на Delphi dll-ки, в которой была бы реализована фукция рассчета, например,  гипотенузы по двум катетам? Т.е. чтобы при наборе в Матлабе Gipoten(3,4) он выдавал 5, а не ругался "Invalid MEX-file"?


 
Tdu ©   (2007-07-25 12:54) [12]

Я имею в виду паскалевский текст для library.


 
Сергей М. ©   (2007-07-26 10:07) [13]


> а ты сам попробовал?


Нет, не пробовал.

Про MatLab мне известно лишь название и общее назначение пакета.

Все остальное, изложенное мной, я почерпнул из Тырнета (просто из любопытства и для общей ориентировки в сабже на будущее).


> чтобы при наборе в Матлабе Gipoten(3,4) он выдавал 5, а
> не ругался "Invalid MEX-file"


Судя по инф-ции в приведенных ссылках, первое, что ты должен соблюсти :

- твоя библиотека должна иметь имя Gipoten.dll и находиться в одной из известных системе или МатЛабу директорий поиска (например, ($WINDOWS)\system32 или директория бин.файлов самого МатЛаба)

1. библиотека должна экспортировать как минимум одну процедуру (для МатЛаб5 - stdcall, для прочих не знаю) с именем "mexFunction", именно в таких регистрах символов и никаких иных, т.е. никакой отсебячины, иначе МатЛаб откажется с такой библ-кой, как в твоем примере [6]

2. прототип процедуры mexFunction должен соответствовать приведенному по ссылке в [8], там же приведены прототипы ф-ций в составе MatLab API.

Протокол инф.обмена (ПИО) между МатЛабом и мех-модулями довольно детально изложен по ссылке в [7]

Судя по увиденному тобой сообщению "Hallo Welt" п.1 был тобой соблюден, иначе МатЛаб повторил бы отказ вида [6]

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

- процедура



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.042 c
15-1185877291
savyhinst
2007-07-31 14:21
2007.08.26
[Прочессы играют в прятки] - Сенсация.ехе!


2-1186236576
DelphiKettle
2007-08-04 18:09
2007.08.26
Сравнение переменных


15-1185830927
uses1
2007-07-31 01:28
2007.08.26
Как упаковать массив чисел не кратных двойке?


2-1185638832
Юра
2007-07-28 20:07
2007.08.26
Современные игры


1-1181772512
SkySpeed
2007-06-14 02:08
2007.08.26
Как нормально определить каждое "слово" в коде?..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский