Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compaq Visual Fortran 6.6、动态链接库(DLL)和模块_Dll_Module_Fortran_Fortran90 - Fatal编程技术网

Compaq Visual Fortran 6.6、动态链接库(DLL)和模块

Compaq Visual Fortran 6.6、动态链接库(DLL)和模块,dll,module,fortran,fortran90,Dll,Module,Fortran,Fortran90,我需要使用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 IM

我需要使用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 按任意键继续

但是,如果我使用模块实现相同的算法,我会得到不一致的结果(即零):

结果不正确: S=0.000000000000000 E+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 按任意键继续

您需要添加:

!DEC$属性DLLEXPORT::A、B、S

到模块,以便主程序可以从DLL中看到模块变量。否则,A、B和S是局部变量

编辑:2019年1月16日

我能够登录到Bakhbergen的PC,并最终解决了问题

在CVF 6.6C(以及更高版本的英特尔编译器)中,当您使用具有DLLEXPORT指令的模块时,该指令会变成DLLIMPORT,因此我的建议如下。但事实并非总是如此,而他的版本也没有这种行为。在进行更改之前(我的记忆中说我曾游说过),您必须提供一个单独编译的.mod,其中源代码使用DLLIMPORT而不是DLLEXPORT。当我这么做的时候,这个程序成功了。我不记得到底是哪个更新有这个变化


所以他需要做的是有两个版本的module2.f90,一个带有DLLEXPORT,另一个带有DLLIMPORT。DLLEXPORT版本将内置到DLL中。DLLIMPORT版本只需编译(/c),并且在链接主程序时只使用.mod,而不使用obj。凌乱,我知道,这就是我们更改它的原因。

非常感谢您的建议,莱昂内尔博士,但它不起作用。我希望我理解你并正确地执行了它。你在CVF 6.6上运行过吗?没有,但我在Intel Fortran 19.0.1上运行过。CVF6.6已经有15年多的历史了,我再也没有拷贝了。不过,我本以为它会起作用,就像我是CVF开发人员时一样,这是我尝试过多次的事情。您需要将该行添加到:
REAL(8)::A、B、S
之后,然后重新生成DLL和主程序。另外,我不是一个真正的医生,我只在网络上玩一个。我希望我做了你写的所有正确的事情,但我还是得到了零分。:-)谢谢你抽出时间来帮助我。我知道你在帮助很多人,所以对我来说,你不仅仅是一名医生。以防万一,如果您有机会在CVF中运行此代码,请告诉我。我不再有访问CVF的权限。我建议将您的问题发布在-我认为仍有一些CVF用户在那里。请参阅我的修订答案。
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