2014-11-21 40 views
0

我(尝试!)维护一个非常大的一组FORTRAN代码。此代码包含分散在各处的WRITE语句:捕获Fortran中的写例程

 WRITE(NOUT,2050)DAMPING 
2050 FORMAT(3X,'DAMPING =',F6.2,'%') 

我想要做的就是控制这些WRITE语句。原因是我们需要创建一个额外的输出文件(有一些修改),并且复制语句的工作量太大。相反,我希望对它们进行修改......一种方式可能是有我自己写程序:

 WRITEF(NOUT,2050)DAMPING 
2050 FORMAT(3X,'DAMPING =',F6.2,'%') 

     -------------------------------- 

     SUBROUTINE WRITEF(objectToWrite) 
     ... 
     Code to write out object 
     ... 
     END 

另一种可能是把写语句作为参数:

 WRITEF(WRITE(NOUT,2050)DAMPING) 
2050 FORMAT(3X,'DAMPING =',F6.2,'%') 

     -------------------------------- 

     SUBROUTINE WRITEF(characterToWrite) 
     ... 
     Code to write out character 
     ... 
     END 

但不幸的是我缺乏FORTRAN知识来知道这是否可能,以及如何实现它!

+0

第二个绝对不可能,因为写入不是返回值的函数。看起来你只能选择重构代码,以便在完成计算后将写入语句收集到几个子程序中。 – ja72 2014-11-21 15:17:55

+0

感谢您的反馈,但不幸的是代码编写的方式是不可能的 - 值被写入文件,然后在计算正在运行时被遗忘/覆盖... – qu1ckdry 2014-11-21 17:17:06

+0

请注意,格式只是问题的一部分。 'write'语句通常带有任意长度的任意类型变量列表。有没有干净的方式来使自己的功能,采取这样的参数列表。你想做什么*可能会成为预处理器的工作。 – agentp 2014-11-21 22:56:23

回答

0

如果为格式字符串交换FORMAT语句,你可以不喜欢

SUBROUTINE WRITE_REAL(unit,fmt, x) 
    INTEGER unit 
    CHARACTER(*) fmt 
    REAL x 
    write(unit,fmt) x 
    END 


    WRITEF(NOUT, "(3X,'DAMPING =',F6.2,'%')", DAMPING) 

但我离开你是否有用。我有点怀疑。

+0

如果我能够以某种方式抓取格式语句而不是写出来,那么这种方法可能会有一些用处......'WRITEF(NOUT,,DAMPING)' – qu1ckdry 2014-11-21 17:18:49

+1

@ qu1ckdry不,如果你想做任何子程序重构你的输出,并且你想传递格式,你必须删除'FORMAT'语句并使用格式字符串。没有办法通过标签(IIRC'ASSIGN'不会有帮助)。无论如何,“FORMAT”已经过时(可能不是正式的)。 – 2014-11-21 17:32:09