MST
星途 面试题库

面试题:Fortran与C语言互操作基础

请阐述在Fortran与C语言互操作时,如何处理数据类型的匹配问题,以数组类型为例说明。
28.3万 热度难度
编程语言Fortran

知识考点

AI 面试

面试题答案

一键面试

在Fortran与C语言互操作时处理数组数据类型匹配问题:

  1. 基本数据类型对应
    • Fortran的INTEGER与C的int通常可对应,但要注意Fortran不同INTEGER声明的精度(如INTEGER(4)intINTEGER(8)long long更匹配)。
    • Fortran的REAL对应C的floatDOUBLE PRECISION对应C的double
    • Fortran的LOGICAL在C中无直接对应,可考虑用int(0为假,非0为真)模拟。
  2. 数组声明与存储
    • 存储顺序: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中传递数组名实际传递的是数组首地址。
  3. 函数接口
    • Fortran调用C函数:在Fortran中使用BIND(C)属性声明外部C函数,例如:
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);
  1. 指针与数组
    • 在Fortran中使用POINTER类型时,若要与C互操作,需要注意转换。例如,Fortran指针指向数组可通过ASSOCIATE语句与数组关联,在与C互操作时,要确保传递的地址在两种语言中能正确解析。在C中,指针操作数组较为常见,传递给Fortran时要保证Fortran能正确使用该指针指向的数据。