我必须将一些数组(1D和2D)传递给IDL到我的fortran例程(我是一个“现代fortran”程序员)。 IDL是列主要语言,在调用fortran子例程之前,我已经分配了所有数组。
问题在于IDL可以将任何内容传递给C函数,尽管将数组传递给fortran的一些非标准方法是可行的(例如http://132.248.1.102/~morisset/idl_cours/IDL/fortran.htm
)。所有数组和结构参数都通过IDL函数CALL_EXTERNAL(http://www.exelisvis.com/docs/CALL_EXTERNAL.html)
我正在寻找一个使用ISO_C_BINDINGS来处理1D和2D数组的fortran包装器。我的fortran子程序具有与下一个相同的接口(数学有点复杂)
MODULE test
IMPLICIT NONE
CONTAINS
PURE SUBROUTINE fortran_sub_array(x1a,x2a,ya,x1,x2,y_out)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: x1a,x2a, x1,x2
REAL, DIMENSION(:,:), INTENT(IN) :: ya
REAL, DIMENSION(:,:), INTENT(INOUT) :: y_out
INTEGER :: dim1, dim2, ii, jj
dim1 = size(y_out,1)
dim2 = size(y_out,2)
do jj=1, dim2
do ii=1, dim1
y_out(ii,jj)= 0. !actually some functions...
enddo
enddo
END SUBROUTINE
ENDMODULE
我找到了很多好的答案,但我正在寻找一种传递2D数组的标准方法。我不必分配或取消分配y_out数组,只需用值填充它。在调用fortran_sub_array之前,在IDL中完成对数组维度的所有检查。
答案 0 :(得分:0)
您的问题是假定的形状数组。您将不得不更改Fortran子例程,或编写包装器:
subroutine wrapper(dim1, dim2, x1a,x2a, ya, x1, x2, y_out) bind(C, name="...")
integer(c_int), value :: dim1, dim2
REAL(c_float), DIMENSION(dim1), INTENT(IN) :: x1a x1
REAL(c_float), DIMENSION(dim2), INTENT(IN) :: x2a, x2
REAL(c_float), DIMENSION(dim1,dim2), INTENT(IN) :: ya
REAL(c_float), DIMENSION(dim1,dim2), INTENT(INOUT) :: y_out
call fortran_sub_array(x1a,x2a,ya,x1,x2,y_out)
end subroutine
适当调整边界,我不得不猜。 C方面非常简单,只有两个边界和指针。