Llamar a una función C desde Fortran donde el nombre de la función C se pasó originalmente desde C
Por razones que no son relevantes, debo pasar un nombre de función C / C ++ a una subrutina Fortran, que, a su vez, llama a esa función C. Lo que he encontrado es que puedo pasar con éxito el nombre de la función a la subrutina Fortran. En esa subrutina puedo llamar a la función C correcta. Sin embargo, los argumentos de la función C se rompen en esta llamada (cuando se llama directamente desde C, funciona bien). he utilizadoEncuadernación ISO C para tratar de hacer que esto funcione, en vano.
Aquí hay un MWE:
fortranRoutine.h:extern "C" {
void fortranRoutine_(void(int status));
};
llamado desde Fortran.h:void calledfromFortran(int status);
main.cpp:#include "fortranRoutine.h"
#include "calledfromFortran.h"
using namespace std;
int main(int argc, char** argv) {
calledfromFortran(12);
fortranRoutine_(calledfromFortran);
return 0;
}
fortranRoutine.f90:subroutine fortranRoutine(calledfromFortran)
use iso_c_binding
implicit none
interface
subroutine calledfromFortran(status) bind (c)
use iso_c_binding
integer(kind = c_int), intent(in) :: status
end subroutine calledfromFortran
end interface
integer(kind = c_int) :: one
one = 2
call calledfromFortran(one)
return
end subroutine fortranRoutine
calledfromFortran.cpp:#include <iostream>
#include "stdlib.h"
using namespace std;
void calledfromFortran(int status) {
cout << "In calledfromFortran:" << endl;
cout << " status: " << status << endl;
}
Resultados actualesEjecutando esto actualmente da:
In calledfromFortran:
status: 12
In calledfromFortran:
status: -1641758848
La primera llamada acalledfromFortran
desdemain
Funciona correctamente, pero cuando se llama desdefortranRoutine
el valor está roto Tenga en cuenta que cada vez que se ejecuta ese último valor cambia. ¿Qué estoy haciendo mal?