Io 延续行技巧,在编译时使用CPP指令调整Fortran I/O,避免冗余
在一些传统的Io 延续行技巧,在编译时使用CPP指令调整Fortran I/O,避免冗余,io,dry,fortran90,preprocessor,fortran77,Io,Dry,Fortran90,Preprocessor,Fortran77,在一些传统的fortran77子例程中,我使用位置6的延续标记&和一些cpp指令在编译时调整I/O,这取决于很少的参数,以避免冗余。下面看一个更简单的示例: open(unit=1,file=opfile,status="unknown",form="unformatted") ! read(1) a, b, c
fortran77
子例程中,我使用位置6的延续标记&
和一些cpp
指令在编译时调整I/O
,这取决于很少的参数,以避免冗余。下面看一个更简单的示例:
open(unit=1,file=opfile,status="unknown",form="unformatted")
!
read(1) a, b, c
!
#ifdef _READMORE
& ,d, e
#endif
!
close(1)
现在,经过一些f90
重构(基本上,把几乎所有的东西都放在模块中
),我正在努力重现上述行为,即当且仅当定义了\u READMORE
时,读取d
和e
,由于第一行末尾出现意外的&
,因此我尝试的第一个解决方案(如下所示)无法按预期工作,如果未定义\u READMORE
:
open(unit=1,file=opfile,status="unknown",form="unformatted")
!
read(1) a, b, c &
!
#ifdef _READMORE
,d, e
#endif
!
close(1)
有人能告诉我完成这项任务的最佳方法是什么吗
如果建议的解决方案仍然依赖于这种延续行技巧并保持向后兼容性,这将是值得注意的。到目前为止,我发现的唯一解决方法是再添加一条
read
语句(附带许多副作用):
完全避免上面的续行技巧。但是,如果我没有记错,当定义了\u READMORE
时,读取原始Fortran 77
子例程编写的文件将失败,因为每个读/写
语句都会添加一个换行:
不幸的是,我有很多这样的文件,我不想以这种方式重写它们。我会选择显式版本:
open(unit=1,file=opfile,status="unknown",form="unformatted")
!
!
#ifdef _READMORE
read(1) a, b, c &
,d, e
#else
read(1) a, b, c
#endif
!
close(1)
如您所见,我还尝试在
&
续行下方添加注释行(以防万一\u READMORE
未定义),但正如预期的那样,这被忽略。无论如何,依靠注释行来解决问题是不可取的!XD您的第一个示例将导致读取两行,而可能不是预期的一行。是的,您是对的,这就是为什么此解决方案没有我想要的向后兼容性!。。。谢谢,这可能是最好的折衷方案,只需添加一点重复(当然是为了可读性)。尽管如此,在我看来,当你有两个(或三个)ifdef时,它就不那么可行了,因为我实际上有(即使我在上面没有提到)。考虑到所有可能的#ifdef
和#ifndef
组合很快就会变成一场噩梦……想象一下嵌套的组合会是多么混乱!另一种选择(不是很好)是将需要这些构造的文件作为“固定格式Fortran”,而将其他文件作为“自由格式Fortran”。Fortran标准中有一句很好的话是“软件工具从固定格式转换为自由格式源代码很简单”……你可能是对的@albert,我想知道为什么还有这么多传统的固定格式Fortran文件!我可以将这样的(固定格式FORTRAN)子例程放在一个模块中(即.F90文件)吗?或者这些子例程需要自由格式的标准?不,它不允许混合使用自由格式和固定格式的代码(wold对于读卡器和编译程序来说也是一场噩梦)。@Holmz-什么是必需的?D线是怎么回事?
open(unit=1,file=opfile,status="unknown",form="unformatted")
!
write(1) a, b, c
!
#ifdef _READMORE
& ,d, e
#endif
!
close(1)
open(unit=1,file=opfile,status="unknown",form="unformatted")
!
!
#ifdef _READMORE
read(1) a, b, c &
,d, e
#else
read(1) a, b, c
#endif
!
close(1)