gpt4 book ai didi

dll - 来自 MapleSim/Modelica 的 FORTRAN DLL 调用约定

转载 作者:行者123 更新时间:2023-12-02 03:33:28 25 4
gpt4 key购买 nike

Modelica建模语言支持从外部FORTRAN DLL调用函数,然而MapleSim虽然说完全支持Modelica语言,但只包括对C DLL调用函数的支持,我只好用这个FORTRAN DLL(我不能用 C 重新编程,也不能使用 MapleSim 以外的其他 Modelica 环境),所以我不在未记录的功能领域。

我尝试强制 MapleSim 包含 FORTRAN DLL 并创建了一个自定义组件,但它不起作用。这是我打开自定义组件时得到的代码:[仅相关部分]

    model ExternalCode

function GETPSAT
input Real TC;
output Real PC;
external "C" PC = GETPSAT(TC)
annotation (
Library = "C:/Path/To/My/DLL/FORTRAN.dll", __Maplesoft_callconv = "stdcall");
end GETPSAT;

equation
(PC) = GETPSAT(TC);
annotation (
experiment(__Maplesoft_engine = 2));
end ExternalCode;

我知道我应该将 external "C" 更改为 external "FORTRAN",但是我应该如何处理 __Maplesoft_callconv = "stdcall"?即:FORTRAN 函数的调用约定是什么? (我对调用约定一无所知)。

请注意 MapleSim 6.1(Maple 17)的父环境支持从 FORTRAN 导入外部函数,因此我认为尽管没有记录,MapleSim 有可能支持它。

编辑:顺便说一下,DLL是用Compaq visual fortran编译的(我不记得版本了)

edit2:导出FORTRAN DLL中的函数如下:

FUNCTION GETPSAT(TC) 
!DEC$ ATTRIBUTES ALIAS:'GETPSAT' :: GETPSAT
!DEC$ ATTRIBUTES DLLEXPORT :: GETPSAT
!DEC$ ATTRIBUTES VALUE :: TC
GETPSAT=PSAT11(TC)
RETURN
END

edit3:我不知道这有帮助,但可以像这样从 C# 调用相同的函数:

    [DllImport("C:\\Path\\To\\My\\DLL\\FORTRAN.dll")]
static extern float GETPSAT(float T);

最佳答案

这个特殊的 Fortran 函数应该表现得像一个完全正常的 C 函数,因为它具有的属性。不要添加任何 external(FORTRAN) 或类似内容。它的名称应该是 GETPSAT 并且它接受 1 个浮点值 TC

使用相同的"stdcal" 属性,它是DEC、Compaq 和Intel Fortran 的默认属性https://software.intel.com/sites/products/documentation/hpc/mkl/mkl_userguide_win/GUID-E74229B0-7389-46A6-9FCF-91CD6CD5B0E4.htm

关于dll - 来自 MapleSim/Modelica 的 FORTRAN DLL 调用约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25264314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com