Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法用FORTRAN 77返回当前文件名_Fortran_Filenames_Fortran77 - Fatal编程技术网

有没有办法用FORTRAN 77返回当前文件名

有没有办法用FORTRAN 77返回当前文件名,fortran,filenames,fortran77,Fortran,Filenames,Fortran77,我正在用FORTRAN 77编写同一代码的多个版本,在每一个代码中我都打印文件名和版本号,但是在这么多版本之后,不得不更改这一行已经变得很乏味了。我想知道是否有一种方法可以让代码返回它自己的文件名,因为文件名中有版本号?我现在看到的行是这样的,codevers='testfile\u v009'和print*,“代码版本:”,codevers 唯一的问题是,我复制了代码的前一个版本,并将其更改为新版本,但经常忘记更新代码中的那些行 感谢您的帮助!谢谢。正如评论中所建议的,一种方法是使用编译器预处

我正在用FORTRAN 77编写同一代码的多个版本,在每一个代码中我都打印文件名和版本号,但是在这么多版本之后,不得不更改这一行已经变得很乏味了。我想知道是否有一种方法可以让代码返回它自己的文件名,因为文件名中有版本号?我现在看到的行是这样的,
codevers='testfile\u v009'
print*,“代码版本:”,codevers
唯一的问题是,我复制了代码的前一个版本,并将其更改为新版本,但经常忘记更新代码中的那些行


感谢您的帮助!谢谢。

正如评论中所建议的,一种方法是使用编译器预处理器。例如,如果您使用
test\u ver1.F90
(自由格式)或
test\u ver1.F
(固定格式)

并将其编译为

gfortran test_ver1.F90
./a.out
你会得到

current file = test_ver1.F90
current line =            3
如何调用预处理器取决于使用的编译器,因此请参阅手册。(对于许多编译器,如果文件名的后缀为
.F90
.F
,或者使用
-cpp
-fpp
等选项,则会调用预处理器)


例如,它的一个应用是定义一个代码检查宏

#ifdef __GFORTRAN__
#define _assert_(x) if (.not.(x)) then; print*, "In ",__FILE__,", line ",__LINE__; stop "assertion failed: " // "x"; endif
#else
#define _assert_(x) if (.not.(x)) then; print*, "In ",__FILE__,", line ",__LINE__; stop "assertion failed: " // #x; endif
#endif
将其保存在mymacro.inc中后,以下程序(
test\u ver2.F90

给予


便于进行卫生检查。(您可以通过定义一个空白宏
#define(定义)assert_ux
,从而在生产运行中开销变为零来关闭此功能。)

而不是回答“否”(实际上F77甚至没有包含程序代码的文件的概念),我会说:这似乎是编译器/预处理器或源代码控制系统的工作。如果你提供这些细节,有人可能会给出一个(非标准的)方法来做到这一点。好的,太好了!谢谢你们!另一个选项可能是以某种一致的方式命名可执行文件,然后可以使用
GET\u COMMAND\u参数
(arg 0)来获取该名称。(如果你真的被f77困住了,你的编译器应该有
getarg
)我不会把两者放在一行,宏很容易超过行长限制。您现在不知道源代码将在哪个路径中编译。在Fortran 77中,长度限制特别严格。@VladimirF有没有办法编写不使用分号的宏?如果有的话,我想明确地使用它。另外,“断言”等只是一个例子。如果想要避免较长的行,可以编写类似的子例程。至于行长度,我们可以使用选项使其更大或不受限制(如果真的要使用这样的宏),比如“-ffixed line length none”。现在是2016年,大多数编译器支持标准>=90,即使代码是用F77风格编写的,这也是有效的(我想这是您经常提到的一行…)
#ifdef __GFORTRAN__
#define _assert_(x) if (.not.(x)) then; print*, "In ",__FILE__,", line ",__LINE__; stop "assertion failed: " // "x"; endif
#else
#define _assert_(x) if (.not.(x)) then; print*, "In ",__FILE__,", line ",__LINE__; stop "assertion failed: " // #x; endif
#endif
#include "mymacro.inc"

program main
    integer :: x, y
    x = 7 ; y = 8
    _assert_( x == y )
end program main
In test_ver2.F90, line            6
STOP assertion failed:  x == y