web-dev-qa-db-ja.com

変数に依存する出力のフォーマット文字列

ある変数に依存するようにフォーマットされたFortran書き込みステートメントが欲しいのですが。たとえば、次のように書くことができます。

write(*,'(3f15.3,3f9.2)') x,y,z,(var(i),i=1,nvari)

どこ nvari = 3。しかし、場合によっては、実際に4つの変数がある場合はどうなりますか(つまり、nvari = 4)。私はこのようなものを書きたいと思います:

write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari)

これで、nvariは何でもかまいませんが、出力は好きなように機能します。どうすればこのような作品を作ることができますか?

14
Flux Capacitor

Intel fortranを使用している場合は、このための独自の拡張機能があります。既存の変数を山かっこで囲んで、指定子として機能させることができます。

  write(*,'(3f15.3,<nvari>f9.2)') x,y,z,(var(i),i=1,nvari)
16
laxxy

コンパイラがサポートしている場合は、'(3f15.3, *(f9.2))'

古いコンパイラを使用している場合は、出力する項目よりも大きい数を使用してください(例:'(3f15.3, 999(f9.2))')。フォーマットを使い切る必要はありません。

最も複雑なケースでは、文字列にフォーマットを記述し、それをフォーマットとして使用できます。

write (string, '( "(3f15.3, ", I4, "(f9.2))" )' )  nvari
write (*, string )  x,y,z, (array(i), i=1,nvari)

フォーマットの復帰を含むフォーマットを理解しているため、文字列フォーマットの使用が必要になることはめったにありません。

14
M. S. B.

Writeステートメントに直接フォーマットを書き込む代わりに、文字変数を使用することもできます。

character(len=32) :: my_fmt
my_fmt = '(3f15.3,3f9.2)'
write(*, my_fmt) x, y, z, (var(i), i = 1, nvari)

いわゆる内部書き込み、または内部ファイルへの書き込みを使用して、書き込みステートメントの前に必要な繰り返し回数を含めるように文字変数を操作できるようになりました。

write(my_fmt, '(a, i0, a)') '(3f15.3,', nvari, 'f9.2)'

(宣言されたmy_fmtの長さが、文字列全体を含むのに十分な長さであることを確認してください。)

11
eriktous

あなたはこのようなものを書きたかった:

write(*,'(3f15.3,nvari(f9.2))') x, y, z, (var(i), i=1,nvari)

実際、Fortran標準には、nvariを省略できる古いトリックがあります。

write(*,'(3f15.3,(f9.2))') x, y, z, (var(i), i=1,nvari)

またはこうして:

write(*,'(3f15.3,f9.2)') x, y, z, (var(i), i=1,nvari)

この標準では、形式の最後の記述子は、リスト内のすべての変数に対応するために必要な頻度で暗黙的に繰り返されるとされています。その「最後の記述子」は、記述子の最後のgroupが暗黙的に繰り返されるように、括弧で囲むことができます。次に例を示します。

write(*,'(3f15.3,(2x,f9.2))') x, y, z, (var(i), i=1,nvari)
4
Jeff