我正在为 OpenMP 使用重写一个大型 Fortran-77 程序,其中一个文件包含一个子例程,其中标记为 SAVE 的重要变量在第一次调用主程序时被初始化,然后在同一个子例程中调用时使用它们通过入口点。 我决定用一个包含多个子程序的模块(其功能通过 ENTRY 点调用)用一个长子程序替换这个文件,并在 CONTAINS 语句之前列出源程序中标记为 SAVE 的那些重要变量,以便它们在所有模块子程序调用中都可用。
但是,我无法使用该功能。我还能如何在子例程中重写 SAVE-ENTRY 结构? 我的最小主程序示例:
c elementary program to add two numbers, using
c a module containing important variables and
c two addition functions, one for the case where
c one number is zero and the second for the case
c of non-zero terms
PROGRAM sum0
USE SUMM
INTEGER i,j
WRITE (6,*) 'Enter two numbers: '
READ (5,*) i,j
IF (i .EQ. 0) THEN
CALL sum1(j)
ELSE IF (j .EQ. 0) THEN
CALL sum1(i)
ELSE
CALL sum2(i,j)
ENDIF
END PROGRAM sum0
和模块:
MODULE SUMM
IMPLICIT NONE
c "important" variables that had the status SAVE:
REAL B(2,2), K
c initialization via DATA works similarly to SAVE (I think so):
DATA B/1.0,-3.7,4.3,0.0/, K/33.0/
CONTAINS
SUBROUTINE sum2(i1,j1)
INTEGER i1,j1
i1 = i1 + j1
WRITE (6,*) 'The first element of B is', B(1,1), '.'
WRITE (6,*) 'The K is', K, '.'
WRITE (6,*) 'The sum of the numbers is', i1, '.'
END SUBROUTINE sum2
SUBROUTINE sum1(i1)
INTEGER i1
WRITE (6,*) 'The first element of B is', B(1,1), '.'
WRITE (6,*) 'The K is', K, '.'
WRITE (6,*) 'The sum of the numbers is', i1, '.'
END SUBROUTINE sum1
END MODULE SUMM
原文件:
SUBROUTINE SUMM
IMPLICIT NONE
REAL B(2,2), K
DATA B/1.0,-3.7,4.3,0.0/
SAVE
K = 33.0
RETURN
ENTRY sum2(i,j)
i = i + j
WRITE (6,*) 'The first element of B is', B(1,1), '.'
WRITE (6,*) 'The K is', K, '.'
WRITE (6,*) 'The sum of the numbers is', i, '.'
RETURN
ENTRY sum1(i)
WRITE (6,*) 'The first element of B is', B(1,1), '.'
WRITE (6,*) 'The K is', K, '.'
WRITE (6,*) 'The sum of the numbers is', i, '.'
RETURN
END
欢迎任何帮助!