我试图在Fortran子例程中调用C++函数.该C++函数应该更新整数数组.这是我写的一个非工作代码.有什么问题?
! Fortran function that calls a C++ function.
subroutine my_function()
integer(4) ar(*)
integer(4) get_filled_ar
! Need correct syntax here.
ar = get_filled_ar()
end
// C++ function:
extern "C" {
void get_filled_ar(int *ar){
ar[0] = 1;
ar[1] = 10;
ar[3] = 100;
}
}
Run Code Online (Sandbox Code Playgroud)
使用Fortran 2003,有一种标准的,因此平台和编译器独立的方式来从Fortran调用C,以及任何使用C调用接口的语言.也是从C调用Fortran.虽然各种编译器编写者正在逐步添加Fortran 2003功能,而且很少有完整的2003编译器,但ISO C Binding在许多编译器中已经有一段时间了.ISO C Binding比以前的ad hoc技术工作得更好,这些技术有时记录很少,并且在编译器和平台之间有所不同.要从Fortran调用C,您编写一个"接口",告诉Fortran编译器它应该使用C调用约定和C类型.
这是一个例子.正如Mike写的那样,由于C++函数返回void,因此将它作为子例程在Fortran中处理并调用它.因此,不需要给出类型.此外,在Fortran中的某个位置,您必须为数组保留存储空间 - 最简单的方法是使用维度的数值进行声明.而且你需要某种语言的主程序.
program test_call_C
use iso_c_binding
implicit none
interface c_interface
subroutine get_filled_ar (ar) bind (C, name = "get_filled_ar")
use iso_c_binding
implicit none
integer (c_int), intent (out), dimension (*) :: ar
end subroutine get_filled_ar
end interface c_interface
integer (c_int), dimension (0:3) :: ar
call get_filled_ar (ar)
write (*, *) "Fortran: ar:", ar
stop
end program test_call_C
Run Code Online (Sandbox Code Playgroud)
在C:
void get_filled_ar (
int ar []
) {
ar [0] = 1;
ar [1] = 10;
ar [2] = 100;
return;
}
Run Code Online (Sandbox Code Playgroud)
示例命令:
gcc -c get_filled_ar.c
gfortran get_filled_ar.o test_call_C.f90 -o test_call_C.exe
./test_call_C.exe
Run Code Online (Sandbox Code Playgroud)
要调用C++代码,请使用以下命令."绑定"中指定的名称不需要使用尾随下划线,因此您的C++代码可以直接使用.
g++ -c cplusplus.cc
gfortran cplusplus.o test_call_C.f90 -o test_call_Cplusplus.exe
./test_call_Cplusplus.exe
Run Code Online (Sandbox Code Playgroud)