Fortran:`READ(*,*)`!=命令行参数.如何使用命令行参数?

Deb*_*asu 12 command-line fortran

GCC版本4.6

问题:要找到一种方法,将参数输入到可执行文件中,例如a.out,从命令行 - 更具体地说,输入一个双精度数字数组.

尝试:使用READ(*,*)标准中较旧的命令:程序test.f-

PROGRAM MAIN  
     REAL(8)    :: A,B  
     READ(*,*) A,B
     PRINT*, A+B, COMMAND_ARGUMENT_COUNT()
END PROGRAM MAIN
Run Code Online (Sandbox Code Playgroud)

执行 -

$ gfortran test.f
$ ./a.out 3.D0 1.D0
Run Code Online (Sandbox Code Playgroud)

这没用.经过一番反省,发现了

$./a.out
3.d0,1.d0
   4.0000000000000000                0
Run Code Online (Sandbox Code Playgroud)

确实有效,但第二行是输入提示,并且没有实现以单行完成此操作的目标.此外COMMAND_ARGUMENT_COUNT(),与PERL不同,显示输入提示中的数字实际上并不算作"命令行参数".

Hig*_*ark 21

如果要在命令行上获取提供给程序的参数,请使用(自Fortran 2003)标准内在子例程GET_COMMAND_ARGUMENT.这样的事可能有用

PROGRAM MAIN  
     REAL(8)    :: A,B
     integer :: num_args, ix
     character(len=12), dimension(:), allocatable :: args

     num_args = command_argument_count()
     allocate(args(num_args))  ! I've omitted checking the return status of the allocation 

     do ix = 1, num_args
         call get_command_argument(ix,args(ix))
         ! now parse the argument as you wish
     end do

     PRINT*, A+B, COMMAND_ARGUMENT_COUNT()
END PROGRAM MAIN
Run Code Online (Sandbox Code Playgroud)

注意:

  • 子例程的第二个参数get_command_argument是一个字符变量,您必须将其解析为变为真实(或其他).另请注意,我在args数组的每个元素中只允许12个字符,您可能想要摆弄它.
  • 正如您已经想到的那样read,不会在Fortran程序中读取命令行参数.

因为你想读取一个实数的数组,你可能最好使用你已经想到的方法,即在程序启动后从终端读取它们,这取决于你.