面试题答案
一键面试在Fortran与C语言互操作时处理数组数据类型匹配问题:
- 基本数据类型对应:
- Fortran的
INTEGER
与C的int
通常可对应,但要注意Fortran不同INTEGER
声明的精度(如INTEGER(4)
与int
,INTEGER(8)
与long long
更匹配)。 - Fortran的
REAL
对应C的float
,DOUBLE PRECISION
对应C的double
。 - Fortran的
LOGICAL
在C中无直接对应,可考虑用int
(0为假,非0为真)模拟。
- Fortran的
- 数组声明与存储:
- 存储顺序:Fortran数组按列优先存储,C数组按行优先存储。在互操作时需注意转换。例如,若在Fortran中有数组
A(3, 2)
,其元素存储顺序为A(1,1), A(2,1), A(3,1), A(1,2), A(2,2), A(3,2)
;而在C中声明int A[3][2]
,存储顺序为A[0][0], A[0][1], A[1][0], A[1][1], A[2][0], A[2][1]
。 - 声明方式:Fortran数组声明如
REAL :: ARR(10)
,C中声明float arr[10]
。当传递数组时,在Fortran中可以将数组名作为参数传递,C中传递数组名实际传递的是数组首地址。
- 存储顺序:Fortran数组按列优先存储,C数组按行优先存储。在互操作时需注意转换。例如,若在Fortran中有数组
- 函数接口:
- Fortran调用C函数:在Fortran中使用
BIND(C)
属性声明外部C函数,例如:
- Fortran调用C函数:在Fortran中使用
INTERFACE
SUBROUTINE c_function(arr, n) BIND(C, NAME='c_function')
USE, INTRINSIC :: ISO_C_BINDING
IMPLICIT NONE
REAL(kind = C_FLOAT), DIMENSION(10), INTENT(INOUT) :: arr
INTEGER(kind = C_INT), VALUE :: n
END SUBROUTINE c_function
END INTERFACE
- C调用Fortran函数:在Fortran中使用
BIND(C)
属性声明可被C调用的函数,例如:
SUBROUTINE fortran_function(arr, n) BIND(C, NAME='fortran_function')
USE, INTRINSIC :: ISO_C_BINDING
IMPLICIT NONE
REAL(kind = C_FLOAT), DIMENSION(10), INTENT(INOUT) :: arr
INTEGER(kind = C_INT), VALUE :: n
! Fortran函数体
END SUBROUTINE fortran_function
在C中声明函数原型:
void fortran_function(float arr[10], int n);
- 指针与数组:
- 在Fortran中使用
POINTER
类型时,若要与C互操作,需要注意转换。例如,Fortran指针指向数组可通过ASSOCIATE
语句与数组关联,在与C互操作时,要确保传递的地址在两种语言中能正确解析。在C中,指针操作数组较为常见,传递给Fortran时要保证Fortran能正确使用该指针指向的数据。
- 在Fortran中使用