在 Fortran2003 中,一维假定形状数组是否可以与 C 互操作?
In Fortran2003, is 1D Assumed shape array interoperable with C?
在 Fortran 2003 中,可分配数组不能与 C 互操作。我想这与存储在内存中的额外数组信息有关,这可能会干扰 C 的解释。
但是,如果我将虚拟参数声明为一维假定形状数组怎么办?例如
subroutine outter_subroutine(ma, size_ma)
integer :: size_ma
integer :: ma(size_ma)
call fortran_subroutine(ma)
end subroutine
!-----------------------------
subroutine fortran_subroutine(a)
integer, intent(in) :: a(:)
integer,(kind=c_int):: ierr
...
ierr = some_c_function(a)
...
end subroutine
fortran 的界面可能喜欢
interface
function some_c_function(a)
integer(c_int) :: a(*)
end interface
而在 C 中,原型可能
int some_c_function(int *a)
是否符合 Fortran 2003 标准?
C 可互操作子例程不能具有假定形状参数,但您可以将假定形状数组(或任何其他数组)传递给具有假定大小参数 (a(*)) 的可互操作子例程。如果数组不连续,编译器可能必须创建一个临时数组才能执行此操作。
在 Fortran 2003 中,可分配数组不能与 C 互操作。我想这与存储在内存中的额外数组信息有关,这可能会干扰 C 的解释。
但是,如果我将虚拟参数声明为一维假定形状数组怎么办?例如
subroutine outter_subroutine(ma, size_ma)
integer :: size_ma
integer :: ma(size_ma)
call fortran_subroutine(ma)
end subroutine
!-----------------------------
subroutine fortran_subroutine(a)
integer, intent(in) :: a(:)
integer,(kind=c_int):: ierr
...
ierr = some_c_function(a)
...
end subroutine
fortran 的界面可能喜欢
interface
function some_c_function(a)
integer(c_int) :: a(*)
end interface
而在 C 中,原型可能
int some_c_function(int *a)
是否符合 Fortran 2003 标准?
C 可互操作子例程不能具有假定形状参数,但您可以将假定形状数组(或任何其他数组)传递给具有假定大小参数 (a(*)) 的可互操作子例程。如果数组不连续,编译器可能必须创建一个临时数组才能执行此操作。