16

いくつかの変数に依存するように書式設定された 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何でもかまいませんし、出力は私が好きなように機能します。どうすればこのようなものを作ることができますか?

4

4 に答える 4

18

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

  write(*,'(3f15.3,<nvari>f9.2)') x,y,z,(var(i),i=1,nvari)
于 2012-04-12T13:26:34.830 に答える
15

コンパイラがサポートしている場合、'(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)

フォーマットの復帰を含むフォーマットを理解していれば、文字列フォーマットを使用する必要はほとんどありません。

于 2012-03-26T23:26:35.813 に答える
13

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、文字列全体を含むのに十分な長さであることを確認してください。)

于 2012-03-26T23:27:27.403 に答える
4

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

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)

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

write(*,'(3f15.3,(2x,f9.2))') x, y, z, (var(i), i=1,nvari)
于 2012-09-20T16:53:21.267 に答える