2016-04-08 7 views
1

私はFORTRAN 77と同じコードのいくつかのバージョンで作業しています。すべてのコードでファイル名とバージョン番号を表示しますが、その行を変更するのは面倒です。ファイル名にバージョン番号があるので、コードが独自のファイル名を返す方法があるかどうか疑問に思っていましたか?私の今の行は、このようなものになります。codevers='testfile_v009'print *, 'Code Version: ', codevers 唯一の問題は、以前のバージョンのコードをコピーして新しいバージョンとして変更することですが、コード内の行を更新することを忘れることです。FORTRAN 77の現在のファイル名を返す方法はありますか

ありがとう。

+0

「いいえ」と答えるのではなく(実際には、F77にはプログラムのコードを含むファイルの概念さえありません)代わりに、私は言うでしょう:これはあなたのコンパイラ/プリプロセッサやソース管理システムの仕事のようです。それらについて詳細を述べると、誰かがそれを行うための(非標準的な)方法を与えることができるかもしれません。 – francescalus

+0

大丈夫です!君たちありがとう! –

+0

別のオプションは、ある種の一貫性のある方法で実行ファイルに名前を付けることであるかもしれませんし、 'GET_COMMAND_ARGUMENT'(arg 0)を使ってその名前を得ることができます。 (真剣にf77がついている場合、コンパイラに 'getarg'があるはずです) – agentp

答えて

1

コメントで示唆されているように、1つのアプローチはコンパイラプリプロセッサを使用することです。たとえば、あなたがtest_ver1.F90(書式自由)またはtest_ver1.F(固定形式)を作る場合

program main 
    print *, "current file = ", __FILE__ 
    print *, "current line = ", __LINE__ 
end program 

、あなたはプリプロセッサを起動する方法

current file = test_ver1.F90 
current line =   3 

を取得します

gfortran test_ver1.F90 
./a.out 

としてコンパイル使用するコンパイラによって異なりますので、マニュアルを参照してください。 (多くのコンパイラでは、ファイル名が.F90.Fなどの接尾辞を持っている場合、プリプロセッサが呼び出されます、または-cppまたは-fppのようなオプションを使用します。)


本のアプリケーションは、コードチェックを定義することですmymacro.incに保存これによりマクロ、例えば

#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 

、次のプログラム(test_ver2.F90

#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 

できます。

+0

私は両方を1行に入れません。マクロは簡単に行の長さの制限を超えることができます。ソースコードがどのパスにコンパイルされることは決してありません。 Fortran 77では、長さの制限が特に厳しいです。 –

+0

@VladimirFセミコロンを使用しないマクロを書く方法はありますか?もしあれば、私はそれを間違いなく使用したいと思います。 – roygvib

+0

また、「アサート」などは単なる例です。より長い行を避けたい場合は、いつも同様のサブルーチンを書くことができます。行の長さについては、 "-ffixed-line-length-none"のように、マクロを実際に使用する場合には、オプションを使用してより大きいか無制限にすることができます。そして、それは2016年であり、ほとんどのコンパイラは、コードがF77スタイルで書かれていても有効な、> 90という標準をサポートしています(これはあなたが常に言及している行だと思います...) – roygvib

関連する問題