【发布时间】:2019-05-29 15:40:27
【问题描述】:
我需要为使用 Compaq Visual Fortran 6.6 的 Fortran 应用程序创建和使用动态链接库 (DLL)。以下代码可以正常工作:
PROGRAM AMAIN1
IMPLICIT NONE
REAL(8):: A,B,S
A = 1D0
B = 2D0
CALL SUBRO1(A,B,S)
PRINT*, 'S = ', S
END PROGRAM AMAIN1
SUBROUTINE SUBRO1(A,B,S)
!DEC$ ATTRIBUTES DLLEXPORT :: SUBRO1
IMPLICIT NONE
REAL(8):: A,B,S
S = A + B
RETURN
END SUBROUTINE SUBRO1
结果正确: S = 3.00000000000000 按任意键继续
但是,如果我使用该模块实现相同的算法,我会得到不一致的结果(即零):
PROGRAM AMAIN2
USE MODUL2
A = 1D0
B = 2D0
CALL SUBRO2
PRINT*, 'S = ', S
END PROGRAM AMAIN2
MODULE MODUL2
IMPLICIT NONE
REAL(8):: A,B,S
END MODULE MODUL2
SUBROUTINE SUBRO2
!DEC$ ATTRIBUTES DLLEXPORT :: SUBRO2
USE MODUL2
S = A + B
RETURN
END SUBROUTINE SUBRO2
结果不正确: S = 0.000000000000000E+000 按任意键继续
如上所示,DLL 在两种情况下都只包含子程序(分别为 SUBRO1 和 SUBRO2)。我已经从可视化开发环境构建了 DLL 和 LIB 文件。第二种情况(使用模块)代表我的大型源代码的结构,所以我需要解决这个问题。任何建议将不胜感激。
顺便说一句,不使用 DLL 的相同算法效果很好并且给出了正确的结果:
PROGRAM AMAIN3
USE MODUL3
A = 1D0
B = 2D0
CALL SUBRO3
PRINT*, 'S = ', S
END PROGRAM AMAIN3
MODULE MODUL3
IMPLICIT NONE
REAL(8):: A,B,S
END MODULE MODUL3
SUBROUTINE SUBRO3
USE MODUL3
S = A + B
RETURN
END SUBROUTINE SUBRO3
结果正确: S = 3.00000000000000 按任意键继续
【问题讨论】:
标签: dll module fortran fortran90