【问题标题】:gfortran, DLL and nothing making sense (or working) at all [duplicate]gfortran,DLL,根本没有任何意义(或工作)[重复]
【发布时间】: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(或

简而言之:编译好,链接好,执行好,产生垃圾。

改变 xy 不会改变结果。他们总是 6.0000[...]。

出了什么问题?上面的示例与我在互联网上找到的其他简单示例没有太大区别。

我正在使用 GNU Fortran (MinGW.org GCC Build-20200227-1) 9.2.0,Windows 10 64 位。

【问题讨论】:

  • 请将implicit none添加到你的程序中,看看你没有声明mySinCosmyPiSinCos的返回类型。
  • @francescalus Implicit None 创造了奇迹。谢谢!!!

标签: dll fortran gfortran


【解决方案1】:

如果我把这两个函数变成一个模块就可以了:

    Module myDLL

        Implicit None

        Contains

        ... The two original functions are inserted here ...

    End Module myDLL

并在主程序中导入/使用模块:

    Program TestDLL

        Use myDLL

        Implicit None

        ... Other commands are inserted here ...

    End Program TestDLL

只有这样,正确的结果才会被吐出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多