【问题标题】:How to use command line arguments in Fortran?如何在 Fortran 中使用命令行参数?
【发布时间】:2012-11-30 09:27:25
【问题描述】:

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

执行——

$ gfortran test.f
$ ./a.out 3.D0 1.D0

这不起作用。经过一番反省,发现

$./a.out
3.d0,1.d0
   4.0000000000000000                0

确实有效,但是第二行是输入提示,没有达到单行完成的目的。此外,COMMAND_ARGUMENT_COUNT() 表明输入到输入提示中的数字并不真正算作“命令行参数”,这与 PERL 不同。

【问题讨论】:

  • 你可以做 'echo "3 1" | a.out' 与您的代码。我不建议这样做,但也许这可以帮助您了解 read(*,*) 的作用。
  • 它确实有效!谢谢@george。我确实尝试过./a.out | echo '3.1d0 1.d0'earlier .. 但它没有用。这对我的目的更好,因为这种方式不需要指定格式,这对我来说看起来更自然..和一般!

标签: command-line fortran


【解决方案1】:

如果您想在命令行上将参数输入您的程序,请使用(自 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

注意:

  • 子例程get_command_argument 的第二个参数是一个字符变量,您必须对其进行解析才能变成一个真实的(或其他)。另请注意,我在 args 数组的每个元素中只允许有 12 个字符,您可能想摆弄一下。
  • 您已经知道 read 不用于读取 Fortran 程序中的命令行参数。

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

【讨论】:

  • 另一种方法当然是从 ASCII 或 namelist 输入文件中读取数字数组,您将其名称作为命令行参数传递。
  • 感谢您的精彩回答@High Performance Mark ...您能否添加一个部分或链接到一个页面,其中包含有关如何设置读取格式的信息?分不清哪些是旧的,哪些是新的! READ(*,*) 应该如何在 Fortran 2003 中完成解析?
  • 当您等待我对您的评论的回复时,请尝试使用 Google。
  • 确实找到了this ...但没有在我的gfortran版本上编译!编辑:确实如此。显然更改文件名会影响程序的内容。再次感谢你!
  • read (*,*) 是标准 Fortran,用于从标准输入进行列表定向读取。大多数操作系统将标准输入连接到终端。尽管它已经在语言中使用了很长时间,但它没有任何问题。 Fortran 95 功能的好网页:en.wikipedia.org/wiki/Fortran_95_language_features
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 2018-10-08
  • 2021-08-21
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
相关资源
最近更新 更多