知識の箱
主に気象を研究する上で得た知識と、WEBページ作成のために得た知識を記録しています。
fortranデバッグにプリプロセッサー
プリプロセッサーを使うと、fortranプログラムのデバッグが楽になる。
デバッグの際には、通常write文などでプログラムの挙動を把握するが、このデバッグ用のコマンドは、通常デバッグが終われば必要なくなる。
この作業を簡単にするのがプリプロセッサーで、intel fortranの場合、拡張子がf90である場合にプリプロセッサーを適用される。
例えば、test.f90というプログラムが、
program test
implicite none
#ifdef debug
write(6,*) ‘test debug print’
#endif
stop
end program test
であった場合、
> ifort -fpp -Ddebug test.f90
としてコンパイルするとすると、
#ifdef debug ~ #endif の間が、コンパイラによって解釈され、そこにあるwrite文が取り込まれる。fppはFortran 言語プリプロセッサ。-cppでもよい。
一方、単に、
> ifort test.f90
とコンパイルすると、
#ifdef debug ~ #endif の間はコンパイラによって無視される。
また、fppを用いて、#ifdef~#endifの部分を消したプログラムを作成することもできる。
> fpp -P test.f90 test2.f90
とコンパイルすると、test2.f90のファイルの中身は、
program test
implicite none
stop
end program test
となる。
※-Pを取ると#ifdef~#endifの部分に行番号が入る。
一方、
> fpp -P -Ddebug test.f90 test2.f90
として、コンパイルすると、test2.f90は次のようになる。
program test
implicite none
write(6,*) ‘test debug print’
stop
end program test
またプリプロセッサに特定の値を渡すこともできる.
program test2
implicit none
#if debug==1
write(6,*) ‘debug is 1’
#endif
#if debug==2
write(6,*) ‘debug is 2’
#endif
stop
end program test2
のプログラムを、
> ifort -fpp -Ddebug=1 test2.f90
として実行すると上の#if文(debug==1)が、debugに2を指定すれば下の#if文(debug==2)がコンパイラによって解釈される。
※参考
北大海洋気候物理研究室 Fortran90 Tips
http://www.sci.hokudai.ac.jp/grp/poc/top/old/software/other/fortran_tips/#SEC34