[英]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中创建每次运行都会更改的数组的唯一方法是使数组allocatable
或pointer
。 也有用于本地阵列的自动阵列。
您可以通过这种方式进行分配。 您只需将大小(将其转换为整数后)传递给子例程。 但实际上,我没有理由不对此类内容使用可分配的数据。
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.