【问题标题】:Interpolate string length into fortran format specifier将字符串长度插入 fortran 格式说明符
【发布时间】:2012-12-14 07:27:11
【问题描述】:

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

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

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

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

更新:

这似乎工作(编译):

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

但我后来也有类似的情况:

12 格式 (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”被标记为“格式字符串中需要非负宽度”的错误

【问题讨论】:

    标签: fortran gfortran


    【解决方案1】:

    在 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
    

    如果你还没有这样做。

    【讨论】:

    • 非常有帮助。此外,SCAN 的 BACK 选项也很有用。但我尝试将其应用于程序中的另一个实例。我创建了一个包含格式的字符串变量;当我使用它(“12 FORMAT (fmt12)”或“12 FORMAT (fmt=fmt12)”)时,编译器将该行标记为“格式字符串中需要非负宽度”(它实际上标记了 fmt [in两种情况])。
    【解决方案2】:

    最简单的就是使用现代的fortran

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

    否则我会使用类似的内部写入将数字写入格式字符串。

    【讨论】:

      猜你喜欢
      • 2013-10-09
      • 2015-07-29
      • 1970-01-01
      • 2020-11-14
      • 2011-06-19
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多