Comp Sci Dynamic Link Library, Compaq Visual Fortran 6.6 & Module

AI Thread Summary
Creating a dynamic-link library (DLL) using Compaq Visual Fortran 6.6 can yield inconsistent results when using modules for variable declarations. In the first example, a subroutine correctly calculates the sum of two numbers, but when the same logic is implemented within a module, the result is zero. This discrepancy suggests that the module's variables may not be shared correctly between the DLL and the main program. Debugging efforts indicate that the variables might be assigned different address spaces, leading to the incorrect output. Further investigation into variable scope and memory management in the context of DLLs is recommended for resolution.
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.
 
Physics news 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 Bakhbergen
  • Like
Likes 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.
 
I don't expect any errors reported, just diffferent address spaces assigned in the DLL and the main EXE
 
  • Like
Likes Bakhbergen
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
 

Similar threads

Back
Top