Dynamic Link Library, Compaq Visual Fortran 6.6 & Module

Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
5 replies · 2K views
Bakhbergen
Messages
3
Reaction score
1
Dear Forum Members,
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
IMPLICIT NONE
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
IMPLICIT NONE
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.
 
on Phys.org
Hallo Bakhbergen, ##\qquad## :welcome:

Modul2 is only a declaration of local variables. You need something like COMMON to make them global is what I would suspect.

(old hand, more fortran 77 than f90, but who knows this helps)
 
  • Like
Likes   Reactions: Bakhbergen
BvU said:
However, https://www.tutorialspoint.com/fortran/fortran_modules.htm claims global character.
Your result does not reflect that. Still worth investigating (ask for the addresses of the variables in debug or something ?)

Hello BvU! I appreciate your intention to help with this. There weren't any error / warning during the debugging. Just gives incorrect result.
 
BTW, the same algorithm without using the DLL works well and gives correct result:

PROGRAM AMAIN3
USE MODUL3
IMPLICIT NONE
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
IMPLICIT NONE
S = A + B
RETURN
END SUBROUTINE SUBRO3

S = 3.00000000000000
Press any key to continue