用C语言从IDL调用fortran

用C语言从IDL调用fortran,c,fortran,idl-programming-language,fortran-iso-c-binding,C,Fortran,Idl Programming Language,Fortran Iso C Binding,经过大量的搜索,我决定发布我的问题 我必须将一些数组1D和2D传递到IDL,然后传递给我的fortran例程。我是一名现代fortran程序员。IDL是一种列主语言,在调用fortran子例程之前,我已经分配了所有数组 问题是IDL可以将任何东西传递给C函数,尽管一些将数组传递给fortran的非标准方法是可行的,例如。http://132.248.1.102/~morisset/idl_-cours/idl/fortran.htm。所有数组和结构参数都通过IDL函数调用通过引用传递 我正在寻找

经过大量的搜索,我决定发布我的问题

我必须将一些数组1D和2D传递到IDL,然后传递给我的fortran例程。我是一名现代fortran程序员。IDL是一种列主语言,在调用fortran子例程之前,我已经分配了所有数组

问题是IDL可以将任何东西传递给C函数,尽管一些将数组传递给fortran的非标准方法是可行的,例如。http://132.248.1.102/~morisset/idl_-cours/idl/fortran.htm。所有数组和结构参数都通过IDL函数调用通过引用传递

我正在寻找一个fortran包装器,它使用ISO_C_绑定来处理1D和2D数组。我的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_数组之前,对数组维度的所有检查都在IDL中完成。

您的问题是假定的形状数组。您必须更改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端非常简单,只有两个边界和指针