Fortran Wiki
Question

Compaq Visual Fortran 6.6, Dynamic-Link Library (DLL) and Module

Dear Fortran Users,

I need to create and use dynamic-link library (DLL) for Fortran application using Compaq Visual Fortran 6.6. The following code works just fine:

###########################################

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

###########################################

The result is correct: S = 3.00000000000000 Press any key to continue

###########################################

However, if I implement the same algorithm using the module, I get inconsistent result (i.e. zero):

###########################################

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

###########################################

The result is incorrect: S = 0.000000000000000E+000 Press any key to continue

###########################################

As can be seen above, DLL contains only subprogram in both cases (SUBRO1 and SUBRO2, respectively). I have built DLL and LIB files from the visual development environment. The second case (with the use of module) represents the structure of my large source-code so I need to resolve this issue. Any advice would be greatly appreciated.

BTW, the same algorithm without using the DLL works well and gives correct result:

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 Press any key to continue