来自MapleSim/Modelica的FORTRAN DLL调用约定
Modelica建模语言支持从外部FORTRAN DLL调用函数,然而,MapleSim只支持从C DLL调用函数,尽管它说它完全支持Modelica语言,我别无选择,只能使用这个FORTRAN DLL(我不能用C语言重新编程,也不能使用除MapleSim之外的其他Modelica环境),因此我不在未记录功能领域 我试图强制MapleSim包含FORTRAN DLL,并创建了一个自定义组件,但它不起作用。这是我打开自定义组件时得到的代码:[仅适用于相关部分]来自MapleSim/Modelica的FORTRAN DLL调用约定,dll,fortran,calling-convention,modelica,Dll,Fortran,Calling Convention,Modelica,Modelica建模语言支持从外部FORTRAN DLL调用函数,然而,MapleSim只支持从C DLL调用函数,尽管它说它完全支持Modelica语言,我别无选择,只能使用这个FORTRAN DLL(我不能用C语言重新编程,也不能使用除MapleSim之外的其他Modelica环境),因此我不在未记录功能领域 我试图强制MapleSim包含FORTRAN DLL,并创建了一个自定义组件,但它不起作用。这是我打开自定义组件时得到的代码:[仅适用于相关部分] model External
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;
我知道我应该将外部“C”
更改为外部“FORTRAN”
,但我应该如何处理\uMapleSoft\u callconv=“stdcall”
?即:FORTRAN函数的调用约定是什么?(我对调用约定一无所知)
请注意,MapleSim 6.1(Maple 17)的父EvnEnvironment支持从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个floatTC
的值
使用相同的
“stdcal”
属性,这是DEC、Compaq和Intel Fortran的默认属性是。外部“C”
在这里工作,因为他声明函数使用值调用获取TC。但是如果传递了int,则它可能无法在所有编译器上工作(32位与64位的问题在64位平台上的f2c中很常见,尽管我认为在本例中是32位平台)。也可以添加一个C包装器库来调用标准C函数,而标准C函数又调用fortran函数。在将dll放入system32并像下面这样导出函数GETPSAT(TC)后,我不知何故成功地使其工作!DEC$ATTRIBUTES别名:“'u GETPSAT'::GETPSAT
!DEC$ATTRIBUTES DLLEXPORT::GETPSAT并调用函数GETPSAT
(不是导出的符号\u GETPSAT
)但是我总是得到同样的错误结果,dll工作正常,我试着从c#调用它,它给出了正确的值,你真的使用Visual Fortran吗?