关于Fortran代码的一些问题,对Fortran来说是新的

时间:2014-09-19 18:22:48

标签: fortran fortran90 gfortran

我遇到了一些很难理解的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

1 个答案:

答案 0 :(得分:3)

1)这是(/ ... /)是一个数组构造函数。

表达式(i1,i1=0,nn-1)是一个隐含的循环。

2)使用读取语句

读取它
     integer :: nn

     read(*,*) nn

3)使用可分配的数组

real, allocatable :: omega(:)

...

allocate(omega(nn))

我建议您阅读Fortran教程或Fortran书籍并熟悉这些概念。