繁体   English   中英

通过命令行参数设置数组大小

[英]Setting array size from command line arguments

我知道在Fortran中,如果之前将N声明为parameter (并因此定义为某个值),则可以声明一个由N个元素组成的数组。

另一方面,我知道我可以使用子例程get_command_arg从命令行接受程序接受参数。

我的问题是:

从命令行调用程序时,能否以某种方式声明由命令给定的多个元素组成的数组?

我正在寻找类似命令行的内容:

./main -30 

其中main.f03将以类似以下内容的开头:

integer, parameter :: N = get_command_arg(1)
real :: x(N) ...

我试图不将数组定义为可分配的。

在某些语言中,您可以从命令行初始化变量和命名常量(例如chapel),但是Fortran并不是其中一种。

您说: “我试图不将数组定义为可分配的。” 但这就是问题所在。 您只需要。 没有别的办法了。

您的密码

integer, parameter :: N = get_command_arg(1)

real :: x(N) ...

有几个原因是非法的。

您不能将GET_COMMAND_ARGUMENT()放入常量表达式中,因为它不在允许的函数中。 它不返回编译时常量值。 并且必须在编译时设置parameter初始化程序。

GET_COMMAND_ARGUMENT()是子例程,而不是函数。 它可以返回更多的东西,不仅返回值,还返回长度和状态。 它不是纯函数,并且Fortran标准正在尝试仅使用纯函数。 诸如RANDOM_NUMBER()类的其他东西是子例程。 遵循自己的程序也是一种很好的风格。

在Fortran中创建每次运行都会更改的数组的唯一方法是使数组allocatablepointer 也有用于本地阵列的自动阵列。

您可以通过这种方式进行分配。 您只需将大小(将其转换为整数后)传递给子例程。 但实际上,我没有理由不对此类内容使用可分配的数据。

program main

implicit none

integer :: n,arg_len,istat
character(len=100) :: arg

call get_command_argument(1,value=arg,status=istat)
if (istat/=0) error stop 'error: cannot read first arg'

read(arg,'(I100)',iostat=istat) n
if (istat/=0) error stop 'error: first arg not an integer'

call real_main(n)

contains

    subroutine real_main(n)
    integer,intent(in) :: n
    integer,dimension(n) :: ival
    ival = 1
    write(*,*) ival
    end subroutine real_main

end program main

使用示例:

> ./main 1
       1
> ./main 2
       1           1
> ./main 3
       1           1           1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM