2

gfortran 4.4.6 を使用して、他の人の FORTRAN コードをコンパイルしようとしています。元のコーダーは、Compaq FORTRAN のようなものを使用していました。

問題のコードは、「foo.txt」のようなファイル名を読み取り、「foo_c.txt」という名前の新しいファイルを作成することになっています。

    file_label_end = SCAN(ファイル名, '.') - 1
    WRITE (output_filename,5) ファイル名
    5 FORMAT (A<file_label_end>, '_c.txt' )

gfortran は、文字指定子の開き山かっこについて文句を言います。つまり、"A3" ではなく、"A<(値が 3 の変数)>" です。変数からのフォーマット幅の補間に関する情報が見つかりません...これは可能ですか? そうでない場合、これを修正する最善の方法は何ですか?

アップデート:

これは機能しているようです(コンパイル中):

file_label_end = SCAN(par_filename, '.', .TRUE. ) + 1
output_filename = par_filename(1:file_label_end) // '_c.par'

しかし、後で同様のケースがあります:

12 フォーマット (<n-1>F10.5)
...
READ(1,12) (cat_parm (blk,j), j = 1,n-1)

フォーマット文字列を作成して修正しようとしました:

write(fmt12,'(I0,A4)') n-1, 'F10.5'
!12 フォーマット (fmt12)
12 フォーマット (fmt=fmt12)

ただし、「fmt」の「t」には、「フォーマット文字列に負でない幅が必要です」というエラーが表示されます

4

2 に答える 2

2

<>Fortran 編集記述子での の使用は標準ではありませんが、広く実装されています。確かに、変数から編集記述子を作成できます。標準的な方法は、次のような内部書き込みを使用することです (宣言を省略します)。

format_string = ''
write(format_string,'(a1,i0,a6)') 'A', file_label_end,'''_c.txt''' ! WARNING I haven't tested this

その後

write(output_filename,fmt=format_string) filename

しかし、あなたの場合、これは完全に必要というわけではありません。代わりにこれを試すことができます

file_label_end = SCAN(filename, '.') - 1
WRITE (output_filename,'(a)') filename(1:file_label_end)//'_c.txt'

'a' 編集記述子で幅を省略すると、式内のすべての文字が書き込まれます。あなたは宣言したいかもしれません

character(len=*), allocatable :: output_filename

まだ行っていない場合。

于 2012-12-14T08:48:35.723 に答える
0

最も簡単なのは、最新の fortran を使用することです

WRITE (output_filename,'(a)') trim(filename) // '_c.txt'

それ以外の場合は、同様の内部書き込みを使用してフォーマット文字列に数値を書き込みます。

于 2012-12-14T08:11:22.790 に答える