レガシー Fortran ライブラリへの C++ インターフェイスを用意しました。
レガシー ライブラリの一部のサブルーチンは、醜いが使用可能なステータス コード規則に従ってエラーを報告します。私はそのようなステータス コードを使用して、C++ コードから読み取り可能な例外をスローします。うまく機能します。
一方で、レガシー ライブラリがSTOP
(プログラムを終了させる) 呼び出しを行う場合があります。そして、状態が回復可能であっても、それを行うことがよくあります。
これを C++ 内からキャプチャしたいのですが、これまでのところ成功していません。STOP
次のコードは単純ですが、当面の問題を正確に表しています。
Fortran レガシー ライブラリfmodule.f90
:
module fmodule
use iso_c_binding
contains
subroutine fsub(x) bind(c, name="fsub")
real(c_double) x
if(x>=5) then
stop 'x >=5 : this kills the program'
else
print*, x
end if
end subroutine fsub
end module fmodule
C++ インターフェイスmain.cpp
:
#include<iostream>
// prototype for the external Fortran subroutine
extern "C" {
void fsub(double& x);
}
int main() {
double x;
while(std::cin >> x) {
fsub(x);
}
return 0;
}
コンパイル行 (GCC 4.8.1 / OS X 10.7.4;$
コマンドプロンプトを示します):
$ gfortran -o libfmodule.so fmodule.f90 -shared -fPIC -Wall
$ g++ main.cpp -L. -lfmodule -std=c++11
実行:
$ ./a.out
1
1.0000000000000000
2
2.0000000000000000
3
3.0000000000000000
4
4.0000000000000000
5
STOP x >=5 : this kills the program
どうすればその番号をキャプチャしてSTOP
、別の番号をリクエストできるでしょうか。Fortran コードには触れたくないことに注意してください。
私が試したこと:
std::atexit
: 一度入力すると「戻る」ことはできませんstd::signal
:STOP
キャプチャできるシグナルをスローしていないようです