我遇到了一些很难理解的Fortran代码。
1.代码/ (i1,i1=0,nn-1) /
的结构名称是什么?
如何直接在代码中打印以查看其内容?
2.我正在寻找改变nn
价值而无需重新编译的方法,我该怎么做? nn
应该是数组omega
的长度。
3.如果可更改omega
,我应该如何设置nn
的长度?
我的意思是,当我再没有parameter (nn=20)
时。
program test_20140919
! test
implicit none
integer nn
parameter (nn=20)
real omega(nn)
call test_real(nn, 2.0, 4.0, omega)
print *, omega
end program test_20140919
!c ===
subroutine test_real(nn, o1, o2, omega)
integer nn
real o1, o2
real omega(nn)
print *, nn
omega = o1 + (o2*o1)*(/ (i1,i1=0,nn-1) /)/real(nn-1)
print *, real(nn)
return
end
我已使用终端中的行gfortran test.f -ffree-form -o test
对其进行了编译。
UPD 由于弗拉基米尔F的回答修改了代码版本:
module subs
implicit none
contains
subroutine test_real(nn, o1, o2, omega)
integer nn
real o1, o2
real :: omega(:)
if (.not. allocated(omega)) allocate(omega(nn))
omega = o1 + (o2*o1)*(/ (i1,i1=0,nn-1) /)/real(nn-1)
print *, real(nn)
end subrotine
end module
program test_20140920
! test
use subs
implicit none
integer nn
real, allocatable :: omega(:)
read(*,*) nn
allocate(omega(nn))
call test_real(nn, 2.0, 4.0, omega)
print *, omega
end program test_20140920
答案 0 :(得分:3)
1)这是(/ ... /)
是一个数组构造函数。
表达式(i1,i1=0,nn-1)
是一个隐含的循环。
2)使用读取语句
读取它 integer :: nn
read(*,*) nn
3)使用可分配的数组
real, allocatable :: omega(:)
...
allocate(omega(nn))
我建议您阅读Fortran教程或Fortran书籍并熟悉这些概念。