2

我正在尝试使用 gfortran 4.4.6 编译别人的 FORTRAN 代码。最初的编码器使用了 Compaq FORTRAN 之类的东西。

有问题的代码应该读取像“foo.txt”这样的文件名并创建一个名为“foo_c.txt”的新文件:

    file_label_end = SCAN(文件名, '.') - 1
    WRITE (output_filename,5) 文件名
    5 格式 (A<file_label_end>, '_c.txt' )

gfortran 抱怨字符说明符的左尖括号。也就是说,他有“A<(值为 3 的变量)>”,而不是“A3”。我找不到任何关于从变量中插入格式宽度的信息......这可能吗?如果没有,解决此问题的最佳方法是什么?

更新:

这似乎正在工作(编译):

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)

我试图通过创建一个格式字符串来解决这个问题:

写(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 回答