0

我有一个 fortran 代码,想在 MATLAB (2019) 中运行它。我想坚持使用 silverfrost(64 位)编译器 (FTN95) 来编译我的初始 fortran 代码。为了了解它是如何工作的,我从 Fortran 中的一个简单代码开始:(multiply.f90)

double precision function Mul(nummer1, nummer2)
implicit none
double precision :: nummer1, nummer2
Mul = nummer1 * nummer2
end 

我将其编译为 dll 数据并在 C++ 中使用此 dll 生成 C++ dll(64 位)以在 MATLAB 中使用它。C++ dll 在 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

错误

[notfound,warnings] = loadlibrary('Cppdll.dll','Cppdll.h')我还应该提到 MATLAB 在我运行命令时给了我以下警告:

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.
     '

我在哪里犯了错误以及如何解决这个问题?

提前谢谢!

4

0 回答 0