2014-09-19 69 views
1

我遇到了一些Fortran代码,很难理解。
1.代码/ (i1,i1=0,nn-1) /的结构名称是什么?
如何直接在代码中打印它以查看其内容?
2.我正在寻找方法来改变nn的值而不重新编译,我应该怎么做? nn应该是数组的长度omega
3.如何更改nn以设置omega的长度? 我的意思是当我没有parameter (nn=20)了。关于一段Fortran代码的一些问题,Fortran新手段

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

您也可以使用命令行输入重定向('>')将文本文件重定向为标准输入。程序将从文件中读取。 – 2014-09-20 17:33:07

回答

3

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

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

2)使用读声明

 integer :: nn 

    read(*,*) nn 

3)使用的可分配数组

real, allocatable :: omega(:) 

... 

allocate(omega(nn)) 

我建议你阅读Fortran语言教程或Fortran语言的书,用这些概念熟悉了解它。

+0

2)我期望使用命令行参数,而不是简单的从输入读取数据。 3)没关系,但在这种情况下,我应该为子代码添加一个接口到代码中。 – aestet 2014-09-19 22:03:24

+0

预计,但没有具体说明。在你的编译器手册中寻找'get_command_argument()'。 3)不需要接口块,甚至不需要学习模块。在子程序中使用假定的形状数组''omega(:)'。无需在子例程中对其进行分配。 – 2014-09-19 22:10:15

+0

你能解释一下,为什么使用模块比使用接口更优先?我的第一个想法是,在几个文件中将主程序与辅助子程序分开更容易。 – aestet 2014-09-21 16:15:14