Вызов 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:

Пример ошибки 1

Пример ошибки 2

ошибка

Я также должен упомянуть, что 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.
     '

Где я сделал ошибку и как решить эту проблему?

Спасибо заранее!

0 ответов

Другие вопросы по тегам