Interceptando la parada de Fortran desde C ++
Preparé una interfaz C ++ para una biblioteca heredada de Fortran.
Algunas subrutinas en la biblioteca heredada siguen una convención de código de estado fea pero utilizable para informar errores, y uso dichos códigos de estado para lanzar una excepción legible desde mi código C ++: funciona muy bien.
Por otro lado, a veces la biblioteca legada llama.STOP
(que termina el programa). Y a menudo lo hace a pesar de que la condición es recuperable.
me gustaríacapturar estaSTOP
desde dentro de C ++, y hasta ahora no he tenido éxito.
El siguiente código es simple, pero representa exactamente el problema en cuestión:
La biblioteca legada de Fortranfmodule.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
La interfaz de 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;
}
Las líneas de compilación (GCC 4.8.1 / OS X 10.7.4;$
denota el símbolo del sistema):
$ gfortran -o libfmodule.so fmodule.f90 -shared -fPIC -Wall
$ g++ main.cpp -L. -lfmodule -std=c++11
La carrera:
$ ./a.out
1
1.0000000000000000
2
2.0000000000000000
3
3.0000000000000000
4
4.0000000000000000
5
STOP x >=5 : this kills the program
¿Cómo podría capturar elSTOP
y, digamos, pedir otro número. Notar que yoNo quiero tocar el código de Fortran..
Lo que he intentado:
std::atexit
: no puedo "volver" de él una vez que lo haya ingresadostd::signal
: STOP
No parece lanzar una señal que yo pueda capturar.