我在Fortran中有以下简短的代码,我将其命名为myDLL.f90:
Real(Kind=8) Function mySinCos(x,y)
Real(Kind=8), Intent(In) :: x, y
mySinCos = Sin(x)*Cos(y)
End Function mySinCos
Real(Kind=8) Function myPiSinCos(x,y)
Real(Kind=8), Intent(In) :: x, y
Real(Kind=8), Parameter :: Pi = 4.0d0*Datan(1.0d0)
myPiSinCos = Sin(Pi*x)*Cos(Pi*y)
End Function myPiSinCos
以及以下主程序TestDLL.f90:
Program TestDLL
Real(Kind=8) :: x, y
Real(Kind=8) :: a, b
x = 2.0d-01
y = 9.0d-01
a = mySinCos(x,y) !Should be 0.12349483641187213
b = myPiSinCos(x,y) !Should be -0.5590169943749475
Write(*,*) a
Write(*,*) b
End Program TestDLL
我编译了上述资源并与之链接:
gfortran -shared -fPIC -o myDLL.dll myDLL.f90
gfortran -o a.exe TestDLL.f90 -L。 myDLL.dll
无编译/链接错误,并且a.exe”运行时没有错误消息。它产生的是:
6.0000000000000000
6.0000000000000000
显然不是期望的结果,因为sin(...)* cos(...)绝不能大于0.5(或
简而言之:正确编译,良好链接,良好执行并产生垃圾。
更改x
或y不会更改结果。他们总是6.0000 [...]。出了什么问题?上面的示例与我在互联网上找到的其他简单示例并没有太大区别。
我正在使用GNU Fortran(MinGW.org GCC Build-20200227-1)9.2.0,Windows 10 64位。
我在Fortran中有以下短代码,我将其命名为myDLL.f90:Real(Kind = 8)函数mySinCos(x,y)Real(Kind = 8),Intent(In):: x,y mySinCos = Sin(x)* Cos(y)...
如果将两个功能转换为一个模块,效果很好: