She*_*284 4 fortran fortran77 fortran90
我正在将一些F77文件转换为F90.但是,有一些常见的块未转换.我是F90的新手,没有F77的经验.有人可以告诉我如何将以下示例代码转换为F90吗?
BLOCK DATA SETUP
INTEGER A,B,C
REAL I,J,K,L
COMMON /AREA1/ A,B,C
COMMON /AREA2/ I,J,K,L
DATA A,B,C,I,J,K,L/0,1,2,10.0,-20.0,30.0,-40.0/
END
Run Code Online (Sandbox Code Playgroud)
我的想法是将数组A,B和C放在一个模块中.我没有得到的主要是AREA1和AREA2.如何在F77中使用它们以及如何翻译它们?我的第一个猜测是丢弃它们,只需在模块中定义A,B和C. 但是,它们是一种包含A,B和C的派生类型吗?
首先,原始代码应该在Fortran 90及更高版本中编译.因此,如果没有损坏,请不要尝试修复它.
COMMON
块基本上是全局变量.在使用全局变量的每个过程中,它们必须以相同的方式声明1,然后它们在任何地方共享.像这样的东西:
integer a, b
common /globals/ a, b
Run Code Online (Sandbox Code Playgroud)
更现代的方法是转换globals
为模块:
module globals
implicit none
integer a, b
end module globals
Run Code Online (Sandbox Code Playgroud)
然后use
,您需要访问的所有模块a
和b
program main
use globals
implicit none
a = 4
b = 2
end program main
Run Code Online (Sandbox Code Playgroud)
您可以将DATA
语句放入模块中,或者更简单地初始化声明中的每个变量:
module AREA1
implicit none
integer :: a = 0
integer :: b = 1
integer :: c = 2
end module AREA1
module AREA2
implicit none
real :: i = 10.0
real :: j = -20.0
real :: k = 30.0
real :: l = -40.0
end module AREA2
Run Code Online (Sandbox Code Playgroud)
然后,您可以在需要访问其变量的任何地方之前use AREA1
和use AREA2
之前替换整个事物implicit none
.
编辑:忘记脚注
1公共块的规则更加灵活,因为不同变量的值按照命名的顺序存储在公共内存位置.因此,虽然技术上不需要始终使用相同的COMMON
语句,但如果不这样做,则可以非常轻松地引入错误.
如果你有不同的命名变量(但是相同的类型),那么适应它并不难.说你有
integer a, b
common /globals/ a, b
Run Code Online (Sandbox Code Playgroud)
在主程序和
integer i, j
common /globals/ i, j
Run Code Online (Sandbox Code Playgroud)
在子程序中.假设您使用a
和创建模块b
,则可以在子例程中以这种方式使用它:
use globals, only: i => a, j => b
Run Code Online (Sandbox Code Playgroud)
(注意,如果你使用only
,你必须列出你想要在模块中使用的每个变量.你可以使用类似的东西:only: a, i => b
如果你想要a
和i
.)
当然,以下内容也与之前的globals
常见块兼容,但可能会导致更多麻烦:
integer k(2)
common /globals/ k
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
634 次 |
最近记录: |