现在实现这一点的方式是在Fortran端使用Fortran ISO C绑定。 这是Fortran 2003语言标准的一部分,并且可用于许多编译器;它不特定于gcc。 在本站的许多答案中已经对其进行了描述。 作为语言标准的一部分,它与编译器和平台无关。 而且,您不需要了解编译器的内部传递约定。 使用ISO C绑定,在声明Fortran子例程或函数时,会导致Fortran编译器使用C调用约定,以便可以直接从C调用该过程。 您不需要添加隐藏参数或对Fortran子例程名称进行名称修饰,即没有下划线。 链接器使用的名称来自“bind”选项。
字符串是一个困难的情况,因为在C中它们在技术上是字符数组,您必须在Fortran中匹配这个。 您还必须处理字符串的不同定义:C以null结尾,Fortran以固定长度填充空格。 示例显示了如何实现这一点。 数字更容易处理。 唯一的问题是数组,因为C是行主要的,而Fortran是列主要的,所以多维数组被转置。
int main ( void ) {
char test [10] = "abcd";
myfortsub (test);
return 0;
}
和
subroutine myfortsub ( input_string ) bind ( C, name="myfortsub" )
use iso_c_binding, only: C_CHAR, c_null_char
implicit none
character (kind=c_char, len=1), dimension (10), intent (in) :: input_string
character (len=10) :: regular_string
integer :: i
regular_string = " "
loop_string: do i=1, 10
if ( input_string (i) == c_null_char ) then
exit loop_string
else
regular_string (i:i) = input_string (i)
end if
end do loop_string
write (*, *) ">", trim (regular_string), "<", len_trim (regular_string)
return
end subroutine myfortsub
您需要将 C 代码编译为目标文件,然后使用 gfortran 编译 Fortran 代码并将两者链接在一起:
gcc-mp-4.6 \
-c \
test_fortsub.c
gfortran-mp-4.6 \
test_fortsub.o \
myfortsub.f90 \
-o test_fortsub.exe
输出结果为:
>abcd< 4