web-dev-qa-db-ja.com

Fortran: `READ(*、*)`!=コマンドライン引数。コマンドライン引数の使用方法は?

GCCバージョン4.6

問題:コマンドラインから実行可能ファイル(たとえば_a.out_)にパラメーターをフィードする方法を見つけるには、より具体的には倍精度数の配列をフィードします。

Attempt:標準では古いREAD(*,*)コマンドを使用します:Program _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
_

は機能しますが、2行目は入力プロンプトであり、これを1行で実行するという目的は達成されていません。また、COMMAND_ARGUMENT_COUNT()は、Perlとは異なり、入力プロンプトに入力された数値が実際には「コマンドライン引数」としてカウントされないことを示しています。

12
Debanjan Basu

コマンドラインでプログラムに引数を供給したい場合は、(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の2番目の引数は、実際の(または何でも)に変換するために解析する必要がある文字変数です。 args配列の各要素で許可されている文字は12文字のみであることに注意してください。これをいじってみてください。
  • すでに理解しているように、readはFortranプログラムのコマンドライン引数の読み取りには使用されません。

実数の配列を読みたいので、プログラムの開始後に端末からそれらを読み取るという、すでに理解しているアプローチを使用する方がよい場合があります。それはあなた次第です。

21