用 pgfortran 续行
Line continuation with pgfortran
我正在尝试使用 pgf90 或 pgfortran(可以处理各种源文件,即 f90 或 f77)编译一个用 fortran 77 结构(即具有 .f 扩展名)编写的文件。我的问题是续行。
open(10,file='/home/adaba/original/potentialenergy/vorticity/data/run/fort.10')
所以这一行显然超出了第 72 列。这是我尝试过的。我尝试通过在新行的第 6 列使用“&”字符将其分成两行并进行编译。它编译得很好但是当我 运行 程序时我得到一个错误说没有找到这样的文件因为它将行继续解释为 运行 和 fort.10 之间的额外 space 并且它报告文件没有找到。
所以我将代码保留在一行中,然后添加了 -Mextend,这是用于行扩展的 pgi 特定指令。现在它似乎在子程序中很晚的时候将一些奇怪的字符添加到另一个文件名的末尾。它确实可以正确打开 fort.10,但它无法在代码中打开另一个文件,并在该文件的末尾添加一些奇怪的字符(二进制)。在我的编辑器 Emacs 中,在 fort.10 语句之后我只能看到紫色(表明某些地方不对)。
有 pgi fortran 经验的人可以帮忙吗?
更新
open(10,file='/home/adabas/originalPV/potentialenergy/vorticity/' // &
& 'data/run/fort.10')
我在 &(上行)处或附近收到 pgf90-s-0034 语法错误
pgf版本为17.0.4 64位
在我的脑海中,有几件事我会先尝试。
您可以请求编译器允许 fixed format
(.f) 文件长度超过 72 个字符。在 PGI 中,这是通过 -Mextend
编译器标志完成的。
或者,您应该能够通过将文件分成两行来构造文件名。类似于:
open(10,file='/home/adaba/original/' //
& 'potentialenergy/vorticity/data/run/fort.10')
其中 //
是组合字符串的运算符。还有其他方法可以做到这一点 - 例如,您可以先将字符串定义为 fname
。
扩展@Ross 上面的回答:
在自由格式 Fortran 标准中,还有另一种方法:您可以使用如下所示的 STRING 延续语法:
open(10,file = "/home/adaba/original/&
&potentialenergy/vorticity/data/run/fort.10" )
这里只有一个字符串拆分成两行继续。两个符号之间的白色 space 被完全忽略。但是第一个和第二个符号之前和之后的任何内容,即使是白色 space,也算作字符串的一部分。
我正在尝试使用 pgf90 或 pgfortran(可以处理各种源文件,即 f90 或 f77)编译一个用 fortran 77 结构(即具有 .f 扩展名)编写的文件。我的问题是续行。
open(10,file='/home/adaba/original/potentialenergy/vorticity/data/run/fort.10')
所以这一行显然超出了第 72 列。这是我尝试过的。我尝试通过在新行的第 6 列使用“&”字符将其分成两行并进行编译。它编译得很好但是当我 运行 程序时我得到一个错误说没有找到这样的文件因为它将行继续解释为 运行 和 fort.10 之间的额外 space 并且它报告文件没有找到。
所以我将代码保留在一行中,然后添加了 -Mextend,这是用于行扩展的 pgi 特定指令。现在它似乎在子程序中很晚的时候将一些奇怪的字符添加到另一个文件名的末尾。它确实可以正确打开 fort.10,但它无法在代码中打开另一个文件,并在该文件的末尾添加一些奇怪的字符(二进制)。在我的编辑器 Emacs 中,在 fort.10 语句之后我只能看到紫色(表明某些地方不对)。
有 pgi fortran 经验的人可以帮忙吗?
更新
open(10,file='/home/adabas/originalPV/potentialenergy/vorticity/' // &
& 'data/run/fort.10')
我在 &(上行)处或附近收到 pgf90-s-0034 语法错误
pgf版本为17.0.4 64位
在我的脑海中,有几件事我会先尝试。
您可以请求编译器允许 fixed format
(.f) 文件长度超过 72 个字符。在 PGI 中,这是通过 -Mextend
编译器标志完成的。
或者,您应该能够通过将文件分成两行来构造文件名。类似于:
open(10,file='/home/adaba/original/' //
& 'potentialenergy/vorticity/data/run/fort.10')
其中 //
是组合字符串的运算符。还有其他方法可以做到这一点 - 例如,您可以先将字符串定义为 fname
。
扩展@Ross 上面的回答: 在自由格式 Fortran 标准中,还有另一种方法:您可以使用如下所示的 STRING 延续语法:
open(10,file = "/home/adaba/original/&
&potentialenergy/vorticity/data/run/fort.10" )
这里只有一个字符串拆分成两行继续。两个符号之间的白色 space 被完全忽略。但是第一个和第二个符号之前和之后的任何内容,即使是白色 space,也算作字符串的一部分。