【发布时间】:2020-06-07 04:12:17
【问题描述】:
我在 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。我的DLL.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 位。
【问题讨论】:
-
请将
implicit none添加到你的程序中,看看你没有声明mySinCos或myPiSinCos的返回类型。 -
@francescalus
Implicit None创造了奇迹。谢谢!!!