Мне нужно создать и использовать динамически подключаемую библиотеку (DLL) для приложения на Фортране, используя Compaq Visual Fortran 6.6.Следующий код работает просто отлично:
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 Нажмите любую клавишу, чтобыпродолжить