在语言之间传递数组

Fortran 按列-主顺序以升序存储阵列元素。 C 按行主顺序存储数组元素。 Fortran 数组下标从 1 开始,而 C 数组下标从 0 开始。

以下示例显示了如何将 A (3, 2) 声明的二维数组存储在 Fortran 和 C 中。

表 1. Fortran 和 C的相应数组布局。 Fortran 数组引用 A(X,Y,Z) 可以用 C 表示为 a[Z-1][Y-1][X-1]。 请记住,尽管 C 按值传递各个标量数组元素,但它按引用传递数组。
  Fortran 元素名称 C 元素名称
最低存储单元 A (1, 1) [0] [0]
  A (2, 1) [0] [1]
  A (3, 1) [1] [0]
  A (1, 2) [1] [1]
  A (2, 2) [2] [0]
最高存储单元 A (3, 2) [2] [1]
要将 Fortran 数组的全部或部分传递到其他语言,可以使用 Fortran 90/Fortran 95 数组表示法:
REAL, DIMENSION(4,8) :: A, B(10)

! Pass an entire 4 x 8 array.
CALL CFUNC( A )
! Pass only the upper-left quadrant of the array.
CALL CFUNC( A(1:2,1:4) )
! Pass an array consisting of every third element of A.
CALL CFUNC( A(1:4:3,1:8) )
! Pass a 1-dimensional array consisting of elements 1, 2, and 4 of B.
CALL CFUNC( B( (/1,2,4/) ) )
必要时, Fortran 程序会构造临时数组并将所有元素复制到连续存储器中。 在所有情况下, C 例程都需要考虑数组的列主布局。
任何数组部分或非连续数组都将作为连续临时的地址传递,除非存在显式接口,其中相应的虚自变量声明为假定的形状数组或指针。 要避免在使用数组自变量调用非Fortran 过程时创建数组描述符 (对于语言间调用不支持) ,请不要为非Fortran 过程提供任何显式接口,也不要将相应的哑元自变量声明为假定形状或接口中的指针:
! This explicit interface must be changed before the C function
! can be called.
INTERFACE
  FUNCTION CFUNC (ARRAY, PTR1, PTR2)
    INTEGER, DIMENSION (:) :: ARRAY          ! Change this : to *.
    INTEGER, POINTER, DIMENSION (:) :: PTR1  ! Change this : to *
                                             ! and remove the POINTER
                                             ! attribute.
    REAL, POINTER :: PTR2                    ! Remove this POINTER
                                             ! attribute or change to TARGET.
  END FUNCTION
END INTERFACE