在C和Fortran之间传递派生类型的值时,需要小心处理,否则这些值可能会出现意外更改。通常,问题出现在使用了以下两种编译器之一的代码中:
- Fortran编译器使用传统的名称装饰方案(通过在名称前添加下划线或双下划线来区分函数)。
- C编译器将在传递派生类型值时使用编译器指定的默认或随机对齐方式。
以下示例说明了如何处理这种情况。Fortran例程声明了一个名为TYPE_TEST的类型:
module my_module
type TYPE_TEST
real :: real_member
character :: char_member
end type TYPE_TEST
contains
subroutine FOO(test_type)
type(TYPE_TEST), intent(inout) :: test_type
而C例程则声明了一个具有类似结构的函数,以便可以调用Fortran中的SUBROUTINE FOO:
struct type_test {
float real_member;
char char_member;
};
void foo_(struct type_test *test_type);
观察到在代码中定义STRUCT和 Fortran类型之间存在差异(FLOAT和REAL的差异),因此在传递值时一定要谨慎。以下代码显示了正确的处理方法:
type TYPE_TEST_FC
real(kind(C_FLOAT)) :: real_member
character(1) :: char_member
end type TYPE_TEST_FC
!
interface
subroutine foo(test_type) bind(C, name='foo_')
import
type(type_test_fc) :: test_type
end subroutine foo
end interface
!
type(TYPE_TEST_FC) :: test_var
!
test_var%real_member = 3.14159265359
test_var%char_member = 'x'
!
call foo(test_var)
在这个例子中,使用“kind”和“bind”关键字,