在语言之间传递数组
Fortran 按列-主顺序以升序存储阵列元素。 C 按行主顺序存储数组元素。 Fortran 数组下标从 1 开始,而 C 数组下标从 0 开始。
以下示例显示了如何将 A (3, 2) 声明的二维数组存储在 Fortran 和 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