Вызов Fortran DLL в Matlab с помощью C++
У меня есть код fortran, и я хочу запустить его в MATLAB (2019). Я хочу использовать компилятор silverfrost (64-разрядный) (FTN95) для компиляции моего исходного кода fortran. Чтобы понять, как это работает, я начал с простого кода на Фортране: (multiply.f90)
double precision function Mul(nummer1, nummer2)
implicit none
double precision :: nummer1, nummer2
Mul = nummer1 * nummer2
end
Я скомпилировал его как данные dll и использовал эту dll в C++ для создания dll C++ (64-разрядной версии) для использования в MATLAB. DLL C++ создается в Visual Studio 2015. Вот мой код C++ (Cppdll.cpp):
// Cppdll.cpp
//
#include "stdafx.h"
#include "Cppdll.h"
using namespace std;
typedef double(*FUNCPOINTER)(double &var1, double &var2);
double DLLRes(double num1, double num2)
{
HINSTANCE hDLL;
FUNCPOINTER myFuncPointer;
double result = -999.99;
hDLL = LoadLibrary(L"multiply.dll");
if (hDLL != NULL)
{
myFuncPointer = (FUNCPOINTER)GetProcAddress(hDLL, "MUL");
if (!myFuncPointer)
{
result = -999.999;
}
else
{
result = myFuncPointer(num1, num2);
}
}
return result;
}
и соответствующий заголовок (Cppdll.h):
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) double DLLRes(double num1, double num2);
#ifdef __cplusplus
}
#endif
Я помещаю эти dll (multiply.dll и Cppdll.dll) в путь MATLAB и загружаю Cppdll в программу. Загружая dll, MATLAB не жалуется, но когда я вызываю функцию dll (например,calllib('Cppdll','DLLRes',2.1,5.23)
), MATLAB неожиданно аварийно завершает работу, т.е. он обычно работает в начале и результаты верны, но через некоторое время MATLAB аварийно завершает работу с / без сообщения об ошибке. Сообщения об ошибках (если отображаются) разные, но все они жалуются на обработчик исключений Silverfrost:
Я также должен упомянуть, что MATLAB дает мне следующее предупреждение, когда я запускаю [notfound,warnings] = loadlibrary('Cppdll.dll','Cppdll.h')
команда:
warnings =
'Cppdll.h
Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <-- HERE in m/struct([^;,{(]*){ <-- HERE (.*?)\}([^;])*;/ at C:\Program Files\MATLAB\R2019a\toolbox\matlab\general\private\prototypes.pl line 912.
Cppdll_thunk_pcwin64.c
Bibliothek "Cppdll_thunk_pcwin64.lib" und Objekt "Cppdll_thunk_pcwin64.exp" werden erstellt.
'
Где я сделал ошибку и как решить эту проблему?
Спасибо заранее!