我正在尝试使用gfortran 4.4.6编译其他人的FORTRAN代码。原始编码器使用了Compaq FORTRAN之类的东西。
有问题的代码应该读取像'foo.txt'这样的文件名并创建一个名为'foo_c.txt'的新文件:
file_label_end = SCAN(filename, '.') - 1 WRITE (output_filename,5) filename 5 FORMAT (A<file_label_end>, '_c.txt' )
gfortran抱怨字符说明符的开角括号。也就是说,不是“A3”而是“A&lt;(值为3的变量)&gt;”。我找不到任何关于从变量插入格式宽度的信息......这可能吗?如果没有,解决这个问题的最佳方法是什么?
更新
这似乎正在起作用(编译):
file_label_end = SCAN(par_filename, '.', .TRUE. ) + 1
output_filename = par_filename(1:file_label_end) // '_c.par'
但后来我遇到了类似的情况:
12 FORMAT (<n-1>F10.5) ... READ(1,12) (cat_parm (blk,j), j = 1,n-1)
我试图通过创建格式字符串来修复:
write(fmt12,'(I0,A4)') n-1, 'F10.5' !12 FORMAT (fmt12) 12 FORMAT (fmt=fmt12)
但是“fmt”中的“t”会被标记为“格式字符串中需要非负宽度”的错误
答案 0 :(得分: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
如果你还没有这样做的话。
答案 1 :(得分:0)
最简单的是使用现代堡垒
WRITE (output_filename,'(a)') trim(filename) // '_c.txt'
否则我会使用类似的内部写入在格式字符串中写入数字。