从Intel移植到GNU gfortran时的可变格式语句

Wat*_*All 2 fortran gfortran fortran90

假设我正在尝试写出如下所示的CSV文件头:

STRING1     2001,     2002,     2003,     2004,
Run Code Online (Sandbox Code Playgroud)

一些可变格式的Fortran90代码可以做到这一点

INTEGER X<Y
X=2001
Y=2004
WRITE(6,'(A,(999(5X,I4,",")))') ' STRING1',(y,y=X,Y)
Run Code Online (Sandbox Code Playgroud)

“ 999”重复完成所需的次数(5X,I4,“,”)格式次数(至少达到999次)。假设X和Y可能会发生变化,因此循环迭代次数也可能会发生变化。

但是,如果我希望标题看起来像这样,在序列的末尾添加一个附加字符串,例如

STRING1     2001,     2002,     2003,     2004, STRING2
Run Code Online (Sandbox Code Playgroud)

...我尝试在格式字符串的末尾添加另一个A,但是这种重复的变量格式结构显然不知道在整数完成后需要“转义”,因此会出错。

我可以通过在格式字符串中包含'ADVANCE =“ no”'并使用新的WRITE语句打印第二个字符串来获得我从根本上想要的东西来解决此问题,但是有一种方法可以用单个格式结构来完成所有操作?

[注意:请不要用尖括号括起来;这是针对GNU gfortran的,它不支持该扩展名]

Ste*_*nel 5

来吧,伙计们,快来参与程序吧!

这是标准的Fortran 2008:

WRITE(6,'(A,*(5X,G0,:,","))') ' STRING1',(y,y=X,Y), ' STRING2'
Run Code Online (Sandbox Code Playgroud)

我相当确定gfortran支持“不确定的组重复计数”。G格式在Fortran 2008中进行了扩展,以支持任何内部数据类型,零宽度表示“最少字符数”。冒号是一种F77功能,可阻止尾随逗号被发出。

有了这个,ifort给了我:

 STRING1     2001,     2002,     2003,     2004,      STRING2
Run Code Online (Sandbox Code Playgroud)

FWIW,我对将y作为循环控制变量重用感到不满意,因为这不是语句实体,并且在循环结束时将其设置为2005。请使用一个单独的变量!