Fortran 中字符串的行延续

Line continuation of strings in Fortran

提问人:Mahendra Thapa 提问时间:5/27/2013 最后编辑:Vladimir F Героям славаMahendra Thapa 更新时间:1/4/2022 访问量:17043

问:

如何在 Fortran 中打破一长串并继续下一行?

我刚刚开始在 Fedora 17 中使用 gfortran 4.7.2。当我尝试使用以下测试代码时,我没有得到输出:

    PROGRAM test_ampersand
    IMPLICIT NONE
    PRINT *, 'I am a new learner of' &
     'fortran'
    END PROGRAM test_ampersand

我期望输出为:

I am a new learner of fortran
字符串 fortran

评论

2赞 milancurcic 5/27/2013
大多数情况下,如果程序确实编译,则包含编译器错误消息,如果程序编译但未运行,则包含运行时错误消息也很有用。

答:

4赞 milancurcic 5/27/2013 #1

当继续有问题的行时,您需要一个逗号,在一行上打印多个变量或文字常量时需要逗号,或者字符串串联,将两个字符串连接成一个。//

这将起作用:

PRINT *, 'I am a new learner of ', &
     'fortran'

这也将起作用:

PRINT *, 'I am a new learner of '// &
     'fortran'

评论

2赞 Mahendra Thapa 6/6/2013
当我使用 gfortran 遵循上述建议时,错误消息为:PRINT *,“我是 '的新学习者”,& 1 错误:PRINT 语句中的预期表达式在 (1) PRINT *,“我是 '// 的新学习者 & 1 错误:表达式中的语法错误 (1) &f:6.9:'fortran' 1 错误:(1) 处的名称字符无效
11赞 High Performance Mark 5/28/2013 #2

这也应该有效:

PRINT *, 'I am a new learner of &
     &fortran'

也就是说,字符文本可以跨换行符继续,但每个延续行必须在第一个非空白位置有一个 & 符号。

评论

3赞 Mahendra Thapa 6/6/2013
当我使用 gfortran 时,出现以下消息: PRINT *, 'I am a new learner of & 1 Error: Unterminated character constant starting at (1) Ampersand.f:8.10: &fortran' 1 Error: Invalid character in name at (1)
2赞 ShadSterling 6/3/2015 #3

在我正在编辑的旧代码中,与号必须出现在正好 5 个空格之后的第二行中;此代码中的所有其他非注释行都以 6 个空格开头:

      PROGRAM test_ampersand
      IMPLICIT NONE
      PRINT *, 'I am a new learner of'
     & 'fortran'
      END PROGRAM test_ampersand

这与编译器期望的 fortran 版本有关,它可能从代码中推断出哪个版本。因为我正在编辑遗留代码,所以我必须遵循 FORTRAN 77 样式。您描述的是 Fortran 95 样式。

您可以在文件扩展名中指定语言版本(例如 而不是 )或带有编译器选项(例如 )。如果您不局限于旧版本,最好使用最新版本。.f08.f-std=f2008

(所有固定列要求都与早期版本的 Fortran 在穿孔卡上的编码方式有关;较新的版本提供了其他选项。

评论

0赞 Vladimir F Героям слава 6/3/2015
-std=f2008无能为力。这不是由标准版本控制,而是由源表单(固定表单与自由表单)控制。以固定形式拥有 Fortran 2008 源代码是完全合法的,也是可能的。后缀确实表示形式,但有些编译器不接受 ,而只接受 。.f90 并不意味着 Fortran 90,而是表示自由格式的 fortran 源代码。这令人困惑,但这就是它的工作原理。.f08.f90
7赞 francescalus 11/19/2017 #4

语句延续在自由格式源中的工作方式是将问题的语句转换为

print *, 'I am a new learner of'      'fortran'

这不是一件有效的事情。当然,一个人可以写

print *, 'I am a new learner of'//' fortran'

print *, 'I am a new learner of', 'fortran'

并可能看到大致相同的效果。

但是,正如其他答案中所指出的,文字字符可以使用特殊形式的语句延续在自由格式源中的行边界上继续:

print *, 'I  am a new learner of &
          &fortran'

通常,人们经常看到自由格式的语句继续,只是在非终止行上,如问题中所示。但是,在这个所谓的字符上下文中,我们必须有一个 on 延续行,并且在继续行上,语句继续,字符紧跟在 之后,并且在同一字符上下文中。&&&

然而,对于固定形式的源,情况就不同了。

      print *, 'I am a new learner of'
     1'fortran'

就像

      print *, 'I am a new learner of'    'fortran'  ! Lots of spaces ignored

这又是一个无效的陈述。用

      print *, 'I am a new learner of
     1fortran'

是一个有效的语句,但再次受到所有这些空格的影响,直到第 72 列。

可以在这里使用字符串连接:

      print *, 'I am a new learner of '//
     1         'fortran'

或者干脆在第 72 列处断行(毕竟,我们这样做是因为行很长)。